Как сделать внутреннее обещание завершить цикл перед проверкой условия? - PullRequest
0 голосов
/ 17 декабря 2018

Я все еще новичок в Обещаниях и асинхронном кодировании в JavaScript.Я пытаюсь создать функцию, которая возвращает обещание, которое проходит через массив объектов с setTimeout.На каждом элементе я передам его другой функции, которая возвращает Promise.Если элемент не удовлетворяет условию, я помещаю его в другой массив и передаю этот новый массив в функцию для рекурсивного вызова еще 10 раз, пока он не удовлетворяет условию.Вот код:

const promiseFunc = (item) => {
  return new Promise((resolve, reject) => {
    // Do something

    if (some_kind_of_error) {
      return reject(the_error);
    } else {
      return resolve({
        itemName: item.name,
        status: (item.isComplete === 'complete')
      });
    }

  });
};

const func2 = (listOfItems, count) => {
  return new Promise((resolve, reject) => {
    if (count > 10) {
      reject(new Error("Too many attempts."));
    }

    setTimeout(() => {
      const newList = [];
      listOfItems.forEach(item => {
        promiseFunc(item)
          .then(result => {
            if(result.isCompleted !== true) {
              newList.push(item);
            }
          });
      });

      if (newList.length === 0) {
        return resolve(true);
      } else {
        console.log('Calling func2 again');
        return func2(newList, count+1);
      }
    }, 1000);
  });
};

Проблема в том, что когда я запускаю функцию func2, я всегда получаю true, даже если предполагается повторение.

Когда я пыталсячтобы выйти из системы, я замечаю, что сообщение Calling func2 again не было завершено в терминале.Это означает, что независимо от того, что условие проверки newList всегда будет пустым, следовательно, оно всегда разрешает true и никогда не обращается к оператору else.

Может кто-нибудь объяснить, почему этотекущее поведение?Как мне сделать так, чтобы мой func2 ожидал выполнения if (newList.length === 0), пока не закончится мой цикл forEach?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...