所有异步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 done
1 done
2 done
All done!
樱猿2020/03/23 10:27:57

我尝试使用Easy Way来解决它,并与您分享:

let counter = 0;
            arr.forEach(async (item, index) => {
                await request.query(item, (err, recordset) => {
                    if (err) console.log(err);

                    //do Somthings

                    counter++;
                    if(counter == tableCmd.length){
                        sql.close();
                        callback();
                    }
                });

request是Node js中mssql库的功能。这可以替换您想要的每个功能或代码。祝好运

卡卡西乐2020/03/23 10:27:57

这是异步的Node.js解决方案。

使用异步npm包。

(JavaScript)将forEach循环与内部回调同步

宝儿理查德2020/03/23 10:27:57

希望这能解决您的问题,当我需要在内部执行异步任务的情况下执行forEach时,我通常会使用此方法。

foo = [a,b,c,d];
waiting = foo.length;
foo.forEach(function(entry){
      doAsynchronousFunction(entry,finish) //call finish after each entry
}
function finish(){
      waiting--;
      if (waiting==0) {
          //do your Job intended to be done after forEach is completed
      } 
}

function doAsynchronousFunction(entry,callback){
       //asynchronousjob with entry
       callback();
}
理查德小胖Harry2020/03/23 10:27:57

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

例如:

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

注意:functionAfterForEach是foreach任务完成后要执行的功能。 asynchronous是在foreach内部执行的异步函数。

LGil2020/03/23 10:27:57

我没有Promise的解决方案(这可以确保每个操作在下一个操作开始之前就已结束):

Array.prototype.forEachAsync = function (callback, end) {
        var self = this;
    
        function task(index) {
            var x = self[index];
            if (index >= self.length) {
                end()
            }
            else {
                callback(self[index], index, self, function () {
                    task(index + 1);
                });
            }
        }
    
        task(0);
    };
    
    
    var i = 0;
    var myArray = Array.apply(null, Array(10)).map(function(item) { return i++; });
    console.log(JSON.stringify(myArray));
    myArray.forEachAsync(function(item, index, arr, next){
      setTimeout(function(){
        $(".toto").append("<div>item index " + item + " done</div>");
        console.log("action " + item + " done");
        next();
      }, 300);
    }, function(){
        $(".toto").append("<div>ALL ACTIONS ARE DONE</div>");
        console.log("ALL ACTIONS ARE DONE");
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="toto">

</div>