如何在检查条件之前做出内部承诺完成循环?

时间:2018-12-17 05:36:37

标签: javascript promise

我还是Promises和JavaScript异步编码的新手。我正在尝试创建一个函数,该函数返回一个使用setTimeout遍历对象数组的promise。在每个元素上,我将其传递给另一个返回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循环完成?

0 个答案:

没有答案