栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

所有异步forEach回调完成后的回调

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

所有异步forEach回调完成后的回调

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. 处理所有保证同步执行的请求(例如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. 处理所有异步请求而无需“同步”执行(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();


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/464531.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号