多个异步回调 - 使用数组在完成时触发函数

时间:2011-01-19 16:14:09

标签: javascript asynchronous

我正在使用Node.js并进行多次异步调用,这些调用需要在完成后处理数据。我正在筑巢它们,但这是非常低效的,因为直到前一个完成才开始。我想出了这个,只是想知道它是否有任何明显的错误:

var f = function(){},
    actualCallback = function() { /* Do real stuff */ },
    callbacks = [f, f, f, f, actualCallback];

aync(function() {
    callbacks.shift()();
});
aync(function() {
    callbacks.shift()();
});
aync(function() {
    callbacks.shift()();
});
aync(function() {
    callbacks.shift()();
});
aync(function() {
    callbacks.shift()();
});

2 个答案:

答案 0 :(得分:2)

使用parallel中的async library功能。

答案 1 :(得分:1)

你不能定义一个在数组中运行的函数吗?

function asyncSequence(callbacks) {
  function doAsync() {
    async(function() {
      if (!callbacks.length) return;
      callbacks[0]();
      callbacks = callbacks.slice(1);
      setTimeout(doAsync, 0);
    });
  }
  doAsync();
}

然后用你的回调函数数组调用它。

现在,如果你想同时启动所有异步回调,那么我首先看不到问题;只要有必要就开始吧。但是,如果你需要在所有这些项目结束时进行某种“加入”,那么你必须跟踪一般状态:

function asyncSequenceConcurrent(callbacks, whenFinished) {
  var incomplete = callbacks.length;
  for (var i = 0; i < callbacks.length; ++i) {
    async((function(i) {
      return function() {
        callbacks[i]();
        incomplete--;
        if (!incomplete) {
          whenFinished();
        }
      };
    })(i));
  }
}