複数の非同期コールバックを処理するための最良の方法/ライブラリは何ですか? 今、私はこのようなものを持っています:
_.each(stuff, function(thing){
async(thing, callback);
});
の各要素に対してコールバックが発生した後で、いくつかのコードを実行する必要がありますstuff
。
これを行う最もクリーンな方法は何ですか? 私はライブラリを使用することにオープンです。
複数の非同期コールバックを処理するための最良の方法/ライブラリは何ですか? 今、私はこのようなものを持っています:
_.each(stuff, function(thing){
async(thing, callback);
});
の各要素に対してコールバックが発生した後で、いくつかのコードを実行する必要がありますstuff
。
これを行う最もクリーンな方法は何ですか? 私はライブラリを使用することにオープンです。
すでにアンダースコアを使用しているので、を見るかもしれません_.after
。それはまさにあなたが求めていることをします。ドキュメントから:
後_.after(count, function)
最初にcount回呼び出された後にのみ実行される関数のバージョンを作成します。続行する前に、すべての非同期呼び出しが終了したことを確認する必要がある非同期応答をグループ化する場合に便利です。
Async.jsと呼ばれる優れたライブラリがあり、多くの非同期およびフロー制御ヘルパーでこのような問題を解決するのに役立ちます。配列/オブジェクト内のすべてのアイテムに対してコールバックを実行するのに役立ついくつかのforEach関数を提供します。
チェックアウト: https ://github.com/caolan/async#forEach
// will print 1,2,3,4,5,6,7,all done
var arr = [1,2,3,4,5,6,7];
function doSomething(item, done) {
setTimeout(function() {
console.log(item);
done(); // call this when you're done with whatever you're doing
}, 50);
}
async.forEach(arr, doSomething, function(err) {
console.log("all done");
});
これにはhttps://github.com/caolan/asyncをお勧めします。これを行うために使用できますasync.parallel
。
function stuffDoer(thing) {
return function (callback) {
//Do stuff here with thing
callback(null, thing);
}
}
var work = _.map(stuff, stuffDoer)
async.parallel(work, function (error, results) {
//error will be defined if anything passed an error to the callback
//results will be an unordered array of whatever return value if any
//the worker functions passed to the callback
}
async.parallel() / async.series は要件に合うはずです。すべての REST 呼び出しが成功したときに実行される最終的なコールバックを提供できます。
async.parallel([
function(){ ... },
function(){ ... }
], callback);
async.series([
function(){ ... },
function(){ ... }
], callback);
カウンターを持っている、と言うasync_count
。リクエストを開始するたびに(ループ内で)1ずつ増やし、コールバックに1ずつ減らして、ゼロに達したかどうかを確認します。ゼロに達した場合は、すべてのコールバックが返されます。
編集:私がこれを書いているのであれば、リクエストを並行して実行するのではなくチェーンします-言い換えると、リクエストのキューがあり、コールバックに次のリクエストのキューをチェックさせます。