foreach是同步还是异步JAVA,完成所有异步forEach回调后的回调

这篇博客讨论了在Java中使用forEach处理异步操作的场景。文章通过多个示例展示了如何确保所有异步操作完成后执行回调,包括使用计数器、Promise、async/await等方法。同时也指出了仅依赖索引可能导致的问题,并提供了其他异步库如async的使用建议。
摘要由CSDN通过智能技术生成

回答(13)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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和其他人)这种方法保证在调用“完成”回调之前处理所有项目 . 您需要使用在回调中更新的计数器 . 取决于索引参数的值不提供相同的保证,因为不保证异步操作的返回顺序 .

使用ES6承诺

(promise库可用于旧版浏览器):

处理保证同步执行的所有请求(例如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'));

使用异步库

还有其他异步库,async是最受欢迎的,提供表达您想要的机制 .

编辑

问题的主体已被编辑,以删除以前的同步示例代码,所以我已更新我的答案澄清 . 原始示例使用同步代码来模拟异步行为,因此应用了以下内容:

array.forEach 是synchronous,因此是 res.write ,因此您可以在调用foreach后简单地进行回调:

posts.foreach(function(v, i) {

res.write(v + ". index " + i);

});

res.end();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值