14

複数の非同期コールバックを処理するための最良の方法/ライブラリは何ですか? 今、私はこのようなものを持っています:

_.each(stuff, function(thing){
   async(thing, callback);
});

の各要素に対してコールバックが発生した後で、いくつかのコードを実行する必要がありますstuff

これを行う最もクリーンな方法は何ですか? 私はライブラリを使用することにオープンです。

4

6 に答える 6

28

すでにアンダースコアを使用しているので、を見るかもしれません_.after。それはまさにあなたが求めていることをします。ドキュメントから:

    _.after(count, function)

最初にcount回呼び出された後にのみ実行される関数のバージョンを作成します。続行する前に、すべての非同期呼び出しが終了したことを確認する必要がある非同期応答をグループ化する場合に便利です。

于 2012-04-24T02:57:52.573 に答える
13

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");
});
于 2012-04-24T02:57:01.967 に答える
2

これには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
}
于 2012-04-24T03:00:26.300 に答える
1

async.parallel() / async.series は要件に合うはずです。すべての REST 呼び出しが成功したときに実行される最終的なコールバックを提供できます。

async.parallel([
    function(){ ... },
    function(){ ... }
], callback);
async.series([
    function(){ ... },
    function(){ ... }
], callback);
于 2016-07-28T18:09:05.780 に答える
0

同様の質問に対する私の回答を参照してください。

node.jsでの並列実行の調整

私のfork()関数は、カウンターを内部的かつ自動的に維持します。

于 2012-04-24T03:00:10.530 に答える
0

カウンターを持っている、と言うasync_count。リクエストを開始するたびに(ループ内で)1ずつ増やし、コールバックに1ずつ減らして、ゼロに達したかどうかを確認します。ゼロに達した場合は、すべてのコールバックが返されます。

編集:私がこれを書いているのであれば、リクエストを並行して実行するのではなくチェーンします-言い換えると、リクエストのキューがあり、コールバックに次のリクエストのキューをチェックさせます。

于 2012-04-24T02:56:46.790 に答える