2015-05-18 30 views
0

據我瞭解,async.series一次只做一件事。你能幫我解譯這個輸出嗎?async.series不是在串聯。爲什麼?

代碼操縱蒙戈數據庫集合:

async.series([ 
     countDocuments(db,function(){console.log("Step 1 complete");}), 
     insertDocument(db,function(){console.log("Step 2 complete");}), 
     countDocuments(db,function(){console.log("Step 3 complete");}), 
     removeDocument(db,function(){console.log("Step 4 complete");}), 
     countDocuments(db,function(){ 
     })], function(){ 
      db.close(); 
    }); 

和輸出:

Step 1 complete 
Step 3 complete 
Step 2 complete 
Step 4 complete 

這是沒有意義的我。整個問題的關鍵是在開始3之前是否等到2完成?

回答

3

您必須將回調函數傳遞給async.series。目前,您只需立即調用所有這些函數 - 並將其結果傳遞給async.series。此外,這些函數中的每個函數都會從async傳遞一個callback參數,您需要異步調用以告知該步驟已完成並且應執行下一個步驟。

async.series([ 
    function(cb) { 
     countDocuments(db,function(e){console.log("Step 1 complete");cb(e);}); 
    }, 
    function(cb) { 
     insertDocument(db,function(e){console.log("Step 2 complete");cb(e);}), 
    }, 
    function(cb) { 
     countDocuments(db,function(e){console.log("Step 3 complete");cb(e);}), 
    }, 
    function(cb) { 
     removeDocument(db,function(e){console.log("Step 4 complete");cb(e);}), 
    }, 
    function(cb) { 
     countDocuments(db, cb); // the short version 
    } 
], function(){ 
    db.close(); 
}); 
+0

Tx,我想我明白了。對於後人來說,這會在數據庫中產生一個Mongo「socket closed」錯誤,就像Nada的答案一樣。我認爲這表明它正在嘗試連接到數據庫,一旦db.close已經發出。 – Dirk

1

我覺得你很容易讓async.series和async.waterfall混淆。在這裏,無論先前的功能是否完成執行,您的4個功能都將啓動。但是,一旦所有的系列函數完成執行(它就像一個障礙),最終回調(執行db.close())將被回調。如果使用async.waterfall,則每個函數都會將其結果傳遞給下一個函數。這意味着第一個將開始和結束,然後第二個將開始和結束,等等。

另一個問題是,您不是在每個函數結束時調用回調函數。如果你不調用回調,執行db.close()的函數將永遠不會被調用。