所有异步forEach回调完成后的回调
如标题所示。我该怎么做呢?
我想whenAllDone()
在forEach循环遍历每个元素并完成一些异步处理后调用。
[1, 2, 3].forEach( function(item, index, array, done) {
asyncFunction(item, function itemDone() {
console.log(item + " done");
done();
});
}, function allDone() {
console.log("All done");
whenAllDone();
}
);
有可能使它像这样工作吗?当forEach的第二个参数是一个回调函数,该函数一旦经过所有迭代便会运行?
预期产量:
3 done1 done
2 done
All done!
回答:
Array.forEach
不能提供这种效果(如果可以的话),但是有几种方法可以实现您想要的效果:
使用一个简单的计数器
function callback () { console.log('all done'); }var itemsProcessed = 0;
[1, 2, 3].forEach((item, index, array) => {
asyncFunction(item, () => {
itemsProcessed++;
if(itemsProcessed === array.length) {
callback();
}
});
});
(由于@vanuan等),这种方法可确保在调用“完成”回调之前处理所有项目。您需要使用在回调中更新的计数器。依赖于index参数的值不能提供相同的保证,因为不能保证异步操作的返回顺序。
使用ES6承诺
(承诺库可用于较旧的浏览器):
处理所有保证同步执行的请求(例如1到2然后3)
function asyncFunction (item, cb) {
setTimeout(() => {
console.log(‘done with’, item);
cb();
}, 100);
}
let requests = [1, 2, 3].reduce((promiseChain, item) => {
return promiseChain.then(() => new Promise((resolve) => {
asyncFunction(item, resolve);
}));
}, Promise.resolve());
requests.then(() => console.log(‘done’))
处理所有异步请求而无需“同步”执行(2个完成可能比1个完成快)
let requests = [1,2,3].map((item) => {
return new Promise((resolve) => {
asyncFunction(item, resolve);
});
})
Promise.all(requests).then(() => console.log(‘done’));
使用异步库
还有其他异步库(异步是最流行的),它们提供了表达所需内容的机制。
编辑
对问题的正文进行了编辑,以删除以前同步的示例代码,因此我更新了答案以进行澄清。原始示例使用类似同步的代码来建模异步行为,因此适用以下内容:
array.forEach
是同步的,也是如此res.write
,因此您只需在调用foreach之后放置回调即可:
posts.foreach(function(v, i) { res.write(v + ". index " + i);
});
res.end();
以上是 所有异步forEach回调完成后的回调 的全部内容, 来源链接: utcz.com/qa/427166.html