为了账号安全,请及时绑定邮箱和手机立即绑定

在完成所有异步回调之后,每个回调都完成了

在完成所有异步回调之后,每个回调都完成了

湖上湖 2019-07-12 16:56:44
在完成所有异步回调之后,每个回调都完成了顾名思义。我该怎么做?我想打电话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();   });能让它像这样工作吗?当用于Each的第二个参数是回调函数时,它会在所有迭代过程中运行吗?预期产出:3 done1 done2 doneAll done!
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

如果遇到异步函数,并且希望在执行代码之前确保它完成任务,那么我们始终可以使用回调功能。

例如:

var ctr = 0;posts.forEach(function(element, index, array){
    asynchronous(function(data){
         ctr++; 
         if (ctr === array.length) {
             functionAfterForEach();
         }
    })});

注:functionAfterForEach是在Foreach任务完成后要执行的函数。asynchronous在foreach中执行的异步函数。


查看完整回答
反对 回复 2019-07-12
?
当年话下

TA贡献1890条经验 获得超9个赞

奇怪的是,给出了多少错误的答案异步凯斯!可以简单地显示,检查索引没有提供预期的行为:

// INCORRECTvar list = [4000, 2000];list.forEach(function(l, index) {
    console.log(l + ' started ...');
    setTimeout(function() {
        console.log(index + ': ' + l);
    }, l);});

产出:

4000 started2000 started1: 20000: 4000

如果我们检查一下index === array.length - 1,将在完成第一次迭代时调用回调,而第一个元素仍未完成!

要解决这个问题,而不需要使用外部库(例如异步),我认为最好的方法是在每次迭代之后节省列表长度和减少。因为只有一条线,所以我们确信没有比赛条件的可能。

var list = [4000, 2000];var counter = list.length;list.forEach(function(l, index) {
    console.log(l + ' started ...');
    setTimeout(function() {
        console.log(index + ': ' + l);
        counter -= 1;
        if ( counter === 0)
            // call your callback here
    }, l);});


查看完整回答
反对 回复 2019-07-12
  • 3 回答
  • 0 关注
  • 546 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信