如何确保运行异步调用的foreach循环完成?

时间:2017-09-21 19:02:00

标签: javascript node.js asynchronous

我有一个foreach循环,我称之为异步函数。如何确保所有异步函数都调用指定的回调函数,然后运行一些东西?

2 个答案:

答案 0 :(得分:2)

保持柜台。 示例:

const table = [1, 2, 3];
const counter = 0;

const done = () => {
     console.log('foreach is done');   
}

table.forEach((el) => {
   doSomeAsync((err, result) => {
      counter++;
      if (counter === 3) {
         done();
      }
   });
});

正如另一个答案所说,你可以使用非常好的异步软件包。但为了它,我建议使用Promises并使用Vanila Promise.all()。示例:

const table = [1, 2, 3];

Promise.all(table.map((el) => {
   return new Promise((resolve, reject) => {
       doSomeAsync((err, result) => {
            return err ? reject(err) : resolve(result); 
       });  
   });
}))
.then((result) => {
     // when all calls are resolved
})
.catch((error) => {
     // if one call encounters an error
});

答案 1 :(得分:1)

您可以使用Async库。它有各种有用的实用功能。

其中有一个Queue函数,可用于执行一组任务,并在执行所有任务时获得回调,您可以执行任何操作。您还可以控制队列的并发性(并行执行多少个任务)。

以下是示例代码 -

// create a queue object with concurrency 2
var q = async.queue(function(task, callback) {
    console.log('hello ' + task.name);
    callback();
}, 2);

// The callback function which is called after all tasks are processed
q.drain = function() {
    console.log('all tasks have been processed');
};

// add some tasks to the queue
q.push({name: 'foo'}, function(err) {
    console.log('finished processing foo');
});
q.push({name: 'bar'}, function (err) {
    console.log('finished processing bar');
});