1

nodejsでUnderscoreJsを使用していて、_.times()メソッドが必要です。times()は関数XをX回呼び出します

これは期待どおりに機能しますが、これが実行しているように見える並列ではなく、一連の反復を行う必要があります。

コールバックメソッドを使用してこれをシリーズで使用する方法があるかどうかについて何か考えはありますか?

4

2 に答える 2

3

このようなものを考えると:

function f() {
    some_async_call({ callback: function(err, results) {...})
}
_(3).times(f);

次に、3 つfの呼び出しが連続して発生しますが、これらのsome_async_call呼び出しは非同期であるため、必ずしも連続して発生するとは限りません。

呼び出しを強制的に連続して実行する場合は、非同期呼び出しでコールバックを使用して、一連の次の呼び出しを起動する必要があります。

function f(times, step) {
    step = step || 0;
    some_async_call({
        callback: function(err, results) {
            // Do something with `err` and `results`...
            if(step < times)
                f(times, step + 1);
        }
    });
}
f(3);

このアプローチでは 3 つsome_async_callsが連続して実行されますが、残念なことに、最初の 1 つがすぐにf(3)返されます。もちろん、この問題に対する 1 つの解決策は、別のコールバックです。

function f(from_n, upto, and_finally) {
    some_async_call({
        callback: function(err, results) {
            // Do something with `err` and `results`...
            if(from_n < upto)
                f(from_n + 1, upto, and_finally);
            else
                and_finally();
        }
    });
}
f(0, 3, function() { console.log('all done') });

これはどこ_.timesにありますか?いいえ、本当にどこにもありません。_.timesは単なるforループです:

_.times = function(n, iterator, context) {
  for (var i = 0; i < n; i++) iterator.call(context, i);
};

_.timesfor完全を期し、使用時にループを追加できるようにするために存在します_.chain。本当にしたいのであれば、おそらくそれを押し込むこともできますが、コードを単純化する代わりに、大きな醜い混乱を招くことになります.

250R の非同期のアイデアを使用することもできますが、3 つの関数の配列を作成する必要が_.rangeありますが、次_.mapの方法よりも適切です_.times

// Untested off the top of my head code...

function f(callback) {
    some_async_call({
        callback: function(err, results) {
            // Deal with `err` and `results`...
            callback();
        }
    });
}

var three_fs = _(3).range().map(function() { return f });
async.series(three_fs);

fただし、コールバック関数を持つように変更する必要があり、常にf3 回呼び出している場合は次のようになります。

async.series([f, f, f]);

と を使用して配列を動的に構築するよりも優れている可能性があり_.rangeます_.map

ここでの本当の教訓は、一度非同期関数呼び出しに入ると、すべてのロジックをコールバックを呼び出すコールバック、コールバックを呼び出すコールバックとして実装することになるということです。

于 2012-05-08T17:26:51.520 に答える
0

この非同期ライブラリを 使用すると、 https://github.com/caolan/async#seriesを開始できる場合があります

または、自分で実行したい場合は、各関数のコールバックが呼び出された後に再帰呼び出しを実行することをお勧めします。ソースコードは次のとおりですhttps://github.com/caolan/async/blob/master/lib/async.js#L101

于 2012-05-08T01:22:11.420 に答える