9

可能重复:
在 node.js 中协调并行执行

首先,动手伪代码:

forEach(arrayelements) {
  asyncQueryFunction(function(qres) {
    //work with query results.
  });
}
// finally, AFTER all callbacks did return:
res.render("myview");

怎么做?

如果这还不够清楚,我会解释:

我需要执行一系列“更新”查询(在 mongodb 中,通过 mongoose),循环遍历文档 ID 列表。对于数组中的每个 id,我将调用一个异步函数,该函数将返回查询结果(实际上我不需要对它们做任何事情)。

我知道我必须使用.forEach()javascript 循环,但是只有当我的所有异步查询都完成时,我才能执行我的“最终”回调?

当我要执行“有限”系列任务时,我已经在使用出色的异步库 ( https://github.com/caolan/async ) 来完成此类任务。但我不认为我可以将一组不同的函数传递给它。

我可以吗?

4

2 回答 2

9

非常简单的模式是使用“运行任务”计数器:

var numRunningQueries = 0
forEach(arrayelements) {
  ++numRunningQueries;
  asyncQueryFunction(function(qres) {
    //work with query results.
    --numRunningQueries;
    if (numRunningQueries === 0) {
       // finally, AFTER all callbacks did return:
       res.render("myview");
    }
  });
}

或者,或者,使用异步帮助程序库,例如Async.js

于 2012-09-18T08:04:33.437 回答
2

如果我理解正确,asyncQueryFunction总是相同的,因为您对每个文档应用相同的更新。

在保存(只是交换更新)多个猫鼬文档(从 CoffeeScript 转换,因此它可能不完美)后,我使用辅助方法进行回调:

function saveAll(docs, callback) {

  // a count for completed operations, and save all errors
  var count = 0
    , errors = [];

  if (docs.length === 0) {
    return callback();
  } else {
    for (var i = 0; i < docs.length; i++) {

      // instead of save, do an update, or asyncQueryFunction
      docs[i].save(function(err) {

        // increase the count in each individual callback
        count++;

        // save any errors
        if (err != null) {
          errors.push(err);
        }

        // once all the individual operations have completed,
        // callback, including any errors
        if (count === docs.length) {
          return callback(errors);
        }
      });
    }
  }
};

saveAll(arrayElements, function(errors) {
  // finally, AFTER all callbacks did return:
  res.render("myview");
}
于 2012-09-18T07:30:45.230 回答