2014-07-21 50 views
3

假設我使用Node.js嘗試運行兩個異步調用以獲得一些答案。我知道有一個異步包,你可以傳遞兩個函數和一個可選的回調函數。Nodejs並行異步調用,但優先

async.parallel([fun1(){callback(null,1);}, 
fun2(){callback(null,2);}], 
function(err, results) { 
}); 

但是假設我現在有一個優先權,如果FUN1返回一個值,然後我不需要FUN2的答案,只有FUN1返回null,則我等FUN2。所以我不想使用回調函數,因爲回調函數等待兩個函數完成,並且fun2可能需要很長時間。

現在,我只是通過爲兩個異步調用創建回調函數來使用非常詳盡的方式。

function(){ 
    var theAnswer,FromFun1,FromFun2; 
    var reply1,reply2; 
    fun1(reply1="answered";FromFun1=1;complete()); 
    fun2(reply2="answered";FromFun2=2;complete()); 
    function complete(answer){ 
     if(reply1=="answered"){ 
      theAnswer=FromFun1; 
     }else if(reply1==null){ 
      // Don't do anything because fun1 is not finished running. 
     }else if(reply2=="answered"){ 
      theAnswer=FromFun2; 
     }else{ 
      // Both have no answer, err. 
     } 
    } 
} 

有沒有更好的方法來做到這一點?

+1

您應該嘗試承諾。這將如'var second = fun2();返回fun1()。then(function(r){return r || second;})' – Bergi

+0

謝謝Bergi,這很有幫助。我會投你:) – Evilsanta

+0

謝謝@Bergi,這是有幫助的。我會投你:)。我還有一個問題。在then()中,它返回r,這是答案,或者是'second',這是一個承諾。我下一步如何處理? – Evilsanta

回答

2

我已經使用該方案的關鍵是要回到「完成」回調的第一個參數:

async.parallel([ 
    function(callback){ 
    callback("done",1); 
    }, 
    function(callback){ 
    callback(null,2); 
    } 
], function(err, results) { 
    console.log(err, results); // done [ 1 ] or done [ 1 , 2 ] 
}); 

聽起來像一個黑客,我通常不這樣做,但在像這樣的一些罕見的情況下,它實際上保持代碼乾淨...只是將它記錄下來,以便其他人知道你的意圖是什麼。

+0

使用異常控制流,特別是對於快捷異步函數,是一個聰明的黑客:-) – Bergi

2

它更好地使用瀑布而不是平行執行因爲你可以將結果形式傳遞給你的前一個函數作爲參數。

async.waterfall([ 
function(callback){ 
    callback(null, 'one'); 
}, 
function(arg1, callback){ 

    // arg1 now equals 'one' 
    if(arg1==null){ 
    // it will not take time it returns immediately 
    callback(null, 'done'); 

    }else{ 
    // do your another stuff here fun2 logic here 
    // it will not be executed and so it dont take time 
     } 
    } 
    ], function (err, result) { 
    // result now equals 'done'  
}); 
+0

這是否意味着瀑布中的函數是順序的? – Evilsanta

+0

是的,他們是順序的,但他們沒有花費太多時間 –

+2

OP的好處是並行運行這兩個功能;應該使用這個好處。瀑布發生在一系列,所以雖然這是一個優雅的解決方案,但並不完全最佳。 – zamnuts