2013-10-15 234 views
0

我有四個並行運行的函數。如果任何一個函數在兩者之間失敗,我怎樣才能停止執行其他函數。任何對此的幫助將會非常有幫助。停止並行執行

回答

0

我認爲你應該使用異步庫。異步包含並行功能,並行執行功能(當然)。並且每個函數都需要回調(錯誤,結果)。 如果發生錯誤,異步將切斷所有其他進程。

Documentation

+1

唯一的問題,異步不會停止執行其他功能,它會模擬忽略它。 –

2

,除非它是一個的setTimeout或setInterval的,我覺得你不能。無論如何,您可以在功能邏輯中設置檢查點。它不是一個乾淨的,但它可以工作。例如,檢查在回調其它功能:

var control = true; 

async1(function(e,r){ 
    if(e) { 
    control = false; 
    return callback1(e,r); 
    }; 
    if(control) callback1(e,r); 
}); 

async2(function(e,r){ 
    if(e) { 
    control = false; 
    return callback2(e,r); 
    }; 
    if(control) callback2(e,r); 
}); 

Althougt要做到這一點,我會去與throrin19和說,異步這是一個不錯的lib做到這一點。

但也許你想檢查co。它可以比Async更好地處理您的問題。

+0

fun1(){ //一些I/O操作 //檢查數據庫中的狀態 if(status ===「failed」) throw new Error(「Failed」); } FUN2(){ //等待HTTP響應 } 兩者FUN1()和FUN2()被平行運行。如果fun1()失敗,程序應該終止。 – user87267867

+0

如果你想完成這個程序,你可以做一個簡單的'process.exit()'。如果你只想取消http請求,不要等待響應,你可以用'.destroy()'關閉流。如果我正確理解你的話,這應該有效。 – durum

+0

你可以在這裏看到如何放棄一個更詳細的請求:http://stackoverflow.com/questions/16194017/stop-downloading-the-data-in-nodejs-request – durum

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); 
}); 
+0

但我想你可以用async來實現這樣的功能。雖然內部它做這樣的事情 – vkurchatkin

+0

對。雖然你的問題與我的不同,因爲你只會得到第一個錯誤。什麼是更好的?這真的取決於編碼員想要做什麼。最抽象的異步函數做到這一點是並行的:https://github.com/caolan/async#paralleltasks-callback – durum

+0

是的,這取決於,但由於我們試圖模仿取消我的方法似乎更接近(就好像我們真的取消了他們既不會成功也不會失敗的其他行動)。順便說一下,它看起來async.parallel具有相同的確切行爲 – vkurchatkin