nodejsでUnderscoreJsを使用していて、_.times()
メソッドが必要です。times()は関数XをX回呼び出します
これは期待どおりに機能しますが、これが実行しているように見える並列ではなく、一連の反復を行う必要があります。
コールバックメソッドを使用してこれをシリーズで使用する方法があるかどうかについて何か考えはありますか?
nodejsでUnderscoreJsを使用していて、_.times()
メソッドが必要です。times()は関数XをX回呼び出します
これは期待どおりに機能しますが、これが実行しているように見える並列ではなく、一連の反復を行う必要があります。
コールバックメソッドを使用してこれをシリーズで使用する方法があるかどうかについて何か考えはありますか?
このようなものを考えると:
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);
};
_.times
for
完全を期し、使用時にループを追加できるようにするために存在します_.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
ただし、コールバック関数を持つように変更する必要があり、常にf
3 回呼び出している場合は次のようになります。
async.series([f, f, f]);
と を使用して配列を動的に構築するよりも優れている可能性があり_.range
ます_.map
。
ここでの本当の教訓は、一度非同期関数呼び出しに入ると、すべてのロジックをコールバックを呼び出すコールバック、コールバックを呼び出すコールバックとして実装することになるということです。
この非同期ライブラリを 使用すると、 https://github.com/caolan/async#seriesを開始できる場合があります
または、自分で実行したい場合は、各関数のコールバックが呼び出された後に再帰呼び出しを実行することをお勧めします。ソースコードは次のとおりですhttps://github.com/caolan/async/blob/master/lib/async.js#L101