2011-01-06 65 views
6

我試圖執行一系列函數,每個函數都將回調傳遞給下一個。現在它看起來像這樣(原諒任何小錯誤,我重寫它,因爲我發表文章!):在node.js中使用異步瀑布時的「err」參數

function func1(callback) { 
    callback(null, "stuff"); 
} 

function func2(input, callback) { 
    callback(null, "foo" + input); 
} 

async.waterfall([func1, func2], function(err, result) { 
    sys.puts(result); 
}); 

我的第一個問題是,我不知道如何優雅地啓動這一功能,因爲它可以」不需要輸入。我將最終將其包含在本地函數中,但它仍然讓我略感不安。其次,雖然這個工作,我不知道「錯誤」的論點如何發揮到這一點。如果我嘗試將它插入參數列表中,它會以各種方式中斷。我希望能夠單獨捕獲任何函數中的錯誤 - 或者需要這樣做,因爲我在傳遞的最後一個回調函數上有錯誤?

回答

14

瀑布通常與匿名函數一起使用,因此參數來自外部作用域。

err的工作原理很簡單,當您提供任何計算結果爲true的值時,回調函數瀑布的第一個參數將停止並調用主回調函數。

function doStuff(foo, bla) { 
    // more setup here 

    async.waterfall([ 
     function(callback){ 
      try { 
       // something that might explode 
       callback(null, foo, bla); 

      } catch (e) { 
       callback(e); 
      } 
     }, 

     function(arg1, arg2, callback){ 
      callback(null, 'three'); 
     }, 

     function(arg1, callback){ 
      callback(null, 'done'); 
     } 
    ], 

    function (err, status) { 
     // if the above try/catche catches something, we will end up here 
     // otherwise we will receive 'done' as the value of status 
     // after the third function has finished 
    }); 
} 
0

可以使用async.constant到輸入傳遞給第一個函數鏈:

async.waterfall([ 
    async.constant(parameter), 
    func1, 
    func2 
], function (err, result) {    
}); 

和修改過程中的第一個功能:

function func1(input,callback) { 
    callback(null, "stuff"); 
} 

可選:可以使用非空的第一個參數調用回調:

function func1(input,callback) { 
     callback("something"); 
    } 

在這種情況下,鏈停止,最後的功能將與ERR =「東西」

文檔被稱爲:https://caolan.github.io/async/docs.html#constanthttps://caolan.github.io/async/docs.html#waterfall