0

並行して実行されている 4 つの関数があります。間に 1 つの関数が失敗した場合、他の関数の実行を停止するにはどうすればよいですか。これに関するヘルプは本当に役に立ちます。

4

3 に答える 3

1

関数の実行を停止することはできません。関数は同期的に実行され、返されるため、技術的に停止するものは何もありません。しかし、何らかの方法で基礎となる libuv 機能を使用する非同期タスクが存在する可能性があります (つまり、非同期ノード API またはネイティブ モジュールを呼び出さずに非同期処理を実行することはできません)。関数はそのようなタスクの単なるインターフェースであり、タスクのキャンセルはサポートせず、開始のみをサポートします。

したがって、非同期操作を実際にキャンセルすることはできませんが、実行できることは、他の操作が失敗した場合にその結果を無視することです。実装方法は次のとおりです。

var tasks = [], //array of tasks, functions accepting callback(err) 
    pending = tasks.length, //amount of pending tasks
    failed = false;

function done(err) { //callback for each task
    if (failed) return;
    if (err) {
         failed = true;
         callback(err); //callback for all tasks
    }  

    if (!--pending) callback(); //all tasks completed
}

tasks.forEach(function(task) {
    task(done);
});
于 2013-10-15T10:37:40.777 に答える
0

Async ライブラリを使用する必要があると思います。Asyncには、関数を並行して実行する並列関数が含まれています(もちろん)。そして、各関数はコールバック (エラー、結果) を受け取ります。エラーが発生した場合、Async は他のすべてのプロセスをカットします。

ドキュメンテーション

于 2013-10-15T06:56:50.680 に答える