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

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

顾名思义。我该怎么做?

我想打电话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!


湖上湖
浏览 598回答 3
3回答

隔江千里

如果遇到异步函数,并且希望在执行代码之前确保它完成任务,那么我们始终可以使用回调功能。例如:var ctr = 0;posts.forEach(function(element, index, array){     asynchronous(function(data){          ctr++;           if (ctr === array.length) {              functionAfterForEach();          }     })});注:functionAfterForEach是在Foreach任务完成后要执行的函数。asynchronous在foreach中执行的异步函数。

当年话下

奇怪的是,给出了多少错误的答案异步凯斯!可以简单地显示,检查索引没有提供预期的行为:// 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);});
打开App,查看更多内容
随时随地看视频慕课网APP