@holllop

Бесконечная загрузка страницы, как исправить?

Была идея сделать функцию которая принимает три массива которые я забираю из API.
window.addEventListener('DOMContentLoaded', async () => {
  try {
    const orderDataPromise = getOrderData();
    const workDataPromise = getWorkData();
    const workObjectDataPromise = getWorkObjectData();

    const orderData = await orderDataPromise;
    const workData = await workDataPromise;
    const workObjectData = await workObjectDataPromise;

    processing(orderData, workData, workObjectData);
  } catch (error) {
    console.log(error);
  }
});

function getOrderData() {
  return fetch('http://:3000/orderIdget')
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.log(error));
}

function getWorkData() {
  return fetch('http://:3000/information')
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.log(error));
}

function getWorkObjectData() {
  return fetch('http://:3000/Work_object')
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.log(error));
}

function processing (orderData, workData, workObjectData){
console.log(orderData, workData, workObjectData);
}

и тут всё работает и всё хорошо мне нужно эти 3 массива объединить в один
по этому пишу
function processing (orderData, workData, workObjectData){
  console.log("доступны и в функции", orderData, workData, workObjectData);
  for (let i = 0; i < orderData.length; i++) {
    const orderId = orderData[i].order_id;
    const matchingWorkItems = workData.filter(workItem => workItem.id_order === orderId);

    // Добавляем name_object в текущий элемент orderData, если есть соответствующие элементы в workData
    if (matchingWorkItems.length > 0) {
      matchingWorkItems.forEach(workItem => {
        orderData.splice(i + 1, 0, { ...orderData[i], name_object: workItem.name_object });
      });
    }
  }
}

по идеи эта функция должна была делать следующие, так как в массиве orderData и workData, есть общий item, а если быть точнее, то item.order_id. и мне нужно следующее если item.order_id из массива orderData и item.order_id из массива workData равны между собой, то тогда в массив orderData дозапишется item.name_object из массива workData. Но вместо этого я получил бесконечную загрузку страницы
  • Вопрос задан
  • 116 просмотров
Решения вопроса 1
@holllop Автор вопроса
Причина, по которой у меня возникала бесконечная загрузка, заключается в том, что когда я изменял массив orderData внутри цикла for. Это приводит к изменению длины массива, а следовательно, к изменению условия цикла for, которое проверяет i < orderData.length. В результате, цикл может выполняться бесконечное количество раз, вызывая бесконечную загрузку.
Проблему решил так
function processing (orderData, workData, workObjectData){
  console.log("доступны и в функции", orderData, workData, workObjectData);
  const updatedOrderData = [];
  for (let i = 0; i < orderData.length; i++) {
    const orderId = orderData[i].order_id;
    const matchingWorkItems = workData.filter(workItem => workItem.id_order === orderId);
    if (matchingWorkItems.length > 0) {
      matchingWorkItems.forEach(workItem => {
        updatedOrderData.push({ ...orderData[i], name_object: workItem.name_object });
      });
    }
    updatedOrderData.push(orderData[i]);
  }
  console.log("updatedOrderData", updatedOrderData);
}

так же хочу поблагодарить iljaGolubev за подсказку по оптимизации
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@iljaGolubev
Патамушта.
o=[1,2,3];
console.log('o.len : ',o.length)
// можно убрать && i<10
for(let i=0;i<o.length && i<10; i++){
    o.splice(i+1,0,'added_'+i);
    console.log('NEW o.len : ',o.length)
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы