我还是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
循环完成?