2017-05-23 21 views
0

NodeJsには、非同期作業の作成に役立つ多くのテクニック/ライブラリがあります。ノード非同期ライブラリ、NodeJs標準呼び出し(setImmediate/setTimeout/nextTick)を使用して約束します。サーバー側のアプリケーションに関連して(非同期、setImmediate、約束などを使用して)ネスト非同期呼び出しがある場合のメリット

、時々私は、このようなコードに実行:あなたが見ることができるように

function doWork() { 
    async.parallel([work1func, work2func], 
    (err, result) => { doSomthingWithTheResult(); } 
} 

function work1func(cb) { 
    doSomeStuff1(); 
    async.series([moreWork1, moreWork2…], cb); 
} 

function work2func(cb) { 
    doSomeStuff2(); 
    async.series([moreWork3, moreWork4…], cb); 
} 

、work1Func、work2Func内としてasync.seriesを使用して他の関数への非同期内部呼び出しもありますよく(async.parallelまたは他の非同期メカニズムであった可能性があります)。

Q:ネストされた非同期呼び出しのメリットはありますか?一番上の呼び出しがasyncなのはなぜ非同期に呼び出されているのですか?

誰かが説明してもいいですか(例を挙げてください)、ここでいくつかのルールを教えてもらえますか?非同期呼び出しを非同期呼び出し内に入れ子にする必要があるときと、ただ1つの非同期呼び出しで十分であるとき。

+0

動作を変更せずに、ネストされた呼び出しなしでこれをどのように記述しますか? 'async.parallel'と' async.series'は別のことを行います - 前者は同時に機能し、後者は次々に機能します。 –

+0

ネストされたコールを1回の呼び出しで削除したくありません。私はちょうど内部の非同期呼び出しを疑うことがあります。代わりにdoWork()を呼び出すwork1func()(これは非同期呼び出しを行いません)がmoreWork1()を呼び出し、その後moreWork2()が呼び出されます。 – Mercury

答えて

0

これは利益の問題ではありません。非同期に完了することが知られているが、でもが非同期で完了する内部タスクを呼び出す外部タスクがある場合、外部タスクと内部タスクは互いに独立して非同期を処理する必要があります。内部タスクの非同期性を無視すると、内部タスクが実際に終了する前に外部タスクが誤って完了することがあります。

たとえば、複数の外部サービス(API、データベースなど)にクエリを行い、結果を組み合わせるための操作を実行するモジュールがあるとします。明らかに、モジュールは他のサービスに依存するため、タスクは非同期で完了します。これらのサービスコールはそれぞれ非同期的にも完了します。モジュールはこれらの内部呼び出しの結果で動作するため、非同期でもない場合は正しい出力を返すことができません。

内部タスクが1つだけあっても、このモジュールは結果を処理するためにはまだ待機する必要があります。非同期性を無視することは、どのステージでも出力を気にしない場合にのみ実現可能です。

関連する問題