我怎么知道何时for循环中的所有promise完成执行?有更好的方法吗?
for (let index = 0; index < array.length; index++) {
request(array[index], function (error, response, body) {
promise1().then(result1 => {
if (result1 !== 0) {
promise2().then(result2 => {
promise3(result2);
}
} else {
promise3(result1);
}
});
});
}
console.log('all promises finished');
答案 0 :(得分:2)
通过将代码转换为使用async
/ await
将项目映射到承诺中,然后使用标准的Promise.all()
函数来等待所有承诺得以解决,这变得更加容易:
// promisified request()
const requestP = item =>
new Promise((resolve, reject) => {
request(item, (error, response, body) => {
if (error) return reject(error);
resolve({ response, body });
});
});
const processItem = async item => {
const { response, body } = await requestP(item);
const result1 = await promise1(/* this probably uses response or body? */);
if (result1 !== 0) {
const result2 = await promise2();
return await promise3(result2);
} else {
return await promise3(result1);
}
};
const promises = array.map(processItem);
Promise.all(promises).then(() => {
console.log("all promises finished");
});
答案 1 :(得分:2)
您可以继续在promises
内的列表中添加创建的for loop
。
完成循环后,您可以注册Promise.all
方法。
let list_of_promises = [];
for(...) {
list_of_promises.push(
new Promise(function(resolve, reject)) {
...
}
)
}
Promise.all(list_of_promises).then(function(data)) {
...
}.catch(function(err) {
...
});
如果您所有的promises
得到解决,则将调用.then
方法。
注意:即使您的一个诺言失败,它也会进入.catch
方法内部。