9

重複の可能性:
node.js での並列実行の調整

まず、疑似コードを実践します。

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

どうやってするか?

それが十分に明確でない場合は、次のように説明します。

ドキュメントIDのリストをループして、一連の「更新」クエリを(mongodbで、mongoose経由で)実行する必要があります。配列内の各 ID に対して、クエリ結果を返す非同期関数を呼び出します (実際には何もする必要はありません)。

JavaScript ループを使用する必要があることはわかってい.forEach()ますが、すべての非同期クエリが終了したときにのみ「最終」コールバックを実行するにはどうすればよいですか?

「限られた」一連のタスクを実行する必要がある場合、この種のタスクを達成するために、私はすでに優れた非同期ライブラリ ( 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 に答える