Async: 機能/サポート-空のタスクセット->次のティックで自動的に発生する最終コールバック?

作成日 2017年04月13日  ·  3コメント  ·  ソース: caolan/async

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は何をお勧めしますか?

question

最も参考になるコメント

うん

あなたができる1つの単純化は次のとおりです:

function final(err, results){
    process.nextTick(cb, err, results);
}

async.nextTick / async.setImmediate / process.nextTick / setImmediateすべて、関数に渡される引数を渡すことができます。

全てのコメント3件

ねえ@ORESoftware 、質問ありがとう! 空の配列/セットの場合、 asyncは、パフォーマンス上の理由で組み込みの延期がv2.0.0で削除されたのと同じティックで、最後のコールバックを呼び出します( async < v2.0.0とは思わない)ただし、この場合は延期が組み込まれていました)。

簡単な回避策は、 async.mapasync.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などについては知らなかった。すごい。

このページは役に立ちましたか?
0 / 5 - 0 評価