当所有并行运行的函数完成工作时,如何运行回调?

时间:2013-04-22 10:30:20

标签: node.js asynchronous

我有问题的堆栈: “如何在所有异步函数完成其工作后运行回调”

这是一个例子:

function doTasks(**callback**) {
   doTask1(function() {
   ...
   });

   doTask2(function() {
   ...
   });
}

我不希望一个接一个地执行任务。并行运行它们的想法,但我完成后需要回调。 nodeJ是否具有内置功能?

现在我正在使用EventEmitter和counter的组合。每次任务完成时,它都会运行一个事件。因为我知道有多少任务已经运行。我可以数数并发出回调。但必须采取更灵活的方式。这就是我现在使用的。

var EventEmitter = require("events").EventEmitter;

var MakeItHappen = module.exports = function (runAfterTimes, callback) {
    this._aTimes                = runAfterTimes || 1;
    this._cTimes                = 0;
    this._eventEmmiter          = new EventEmitter();
    this._eventEmmiter.addListener("try", callback);
}

MakeItHappen.prototype.try = function () {
    this._cTimes += 1;
    if (this._aTimes === this._cTimes) {
        this._cTimes = 0;
        this._eventEmmiter.emit("try", arguments);
    }
}

还有其他办法吗?

2 个答案:

答案 0 :(得分:4)

您可以使用异步库https://github.com/caolan/async

async.parallel([
    function(){ ... },
    function(){ ... }
], callback);

答案 1 :(得分:2)

使用计数器:

var a = function (cb){
    //Asynchronous stuff
    cb ();
};

var b = function (cb){
    //Asynchronous stuff
    cb ();
};

var remaining = 2;

var finish = function (){
    if (!--remaining){
        //a and b finished...
    }
};

a (finish);
b (finish);