async.mapまたは実際にはほとんどすべての非同期ユーティリティを使用しているとしましょう
私の質問/機能リクエストは-タスク配列/セットが空の場合、asyncは次のティックで最後のコールバックを起動しますか? そうでない場合は、非同期にそれを行うように指示する方法はありますか? 素晴らしい機能になります。
それ以外の場合は、コードにこれがたくさんありますが、これはより冗長です。
async.map([], function(item,cb){
}, function final(err, results){
process.next(function(){
cb(err,results);
});
});
Zalgoを回避するには、上記が必要ですが、次のようにする方がはるかに優れています。
async.map([], function(item,cb){
}, cb);
配列が空かどうかを確認することもできると思います。空の場合は、
if(![].length){
return process.next(cb);
}
yallは何をお勧めしますか?
ねえ@ORESoftware 、質問ありがとう! 空の配列/セットの場合、 async
は、パフォーマンス上の理由で組み込みの延期がv2.0.0
で削除されたのと同じティックで、最後のコールバックを呼び出します( async < v2.0.0
とは思わない)ただし、この場合は延期が組み込まれていました)。
簡単な回避策は、 async.map
をasync.ensureAsync
ラップすることです。
async.ensureAsync(async.map)([], function(item, cb) {
}, cb);
またはコードの最初のどこか:
const asyncMap = async.ensureAsync(async.map);
// then call `asyncMap` just as you would `async.map`
それ以外の場合、提案したprocess.nextTick
アプローチは完全に有効です。 ただし、ブラウザで使用される可能性のあるコードを記述している場合は、 async.setImmediate
またはasync.nextTick
確認する必要があります。
うん、
あなたができる1つの単純化は次のとおりです:
function final(err, results){
process.nextTick(cb, err, results);
}
async.nextTick
/ async.setImmediate
/ process.nextTick
/ setImmediate
すべて、関数に渡される引数を渡すことができます。
ああ、いいね、process.nextTickなどについては知らなかった。すごい。
最も参考になるコメント
うん、
あなたができる1つの単純化は次のとおりです:
async.nextTick
/async.setImmediate
/process.nextTick
/setImmediate
すべて、関数に渡される引数を渡すことができます。