2015-12-05 54 views
4

對不起,因爲我不知道如何清楚地描述它。爲什麼每個任務的參數應該在async.waterfall中相同

我剛剛遇到一個問題,當我使用async.waterfall並最終解決它。 但我仍然不知道它背後發生了什麼。

我發現: 當我們使用async.waterfall,在參數計算最後的任務應該是同一個任務。 否則,它會說"undefined is not a function"

我已經嘗試了一些測試,我也揣摩其source code。 對不起,我是JavaScript的新手。我無法理解大量的javascript模式。對我來說太難了。

源代碼掙扎了兩個多小時後,我需要一些幫助。 你能不能給我說說這兩個問題的一些提示:

  1. 它是如何處理錯誤,在哪種情況下,它會跳到最後一個回調?

根據我的測試結果,'', null,undefined不會造成跳。這種行爲對我來說很有意義。

  1. 爲什麼參數的計數應該完全一樣?

如果在上一個任務中只傳遞一個參數,當然回調將是未定義的。但我想知道很多。

我知道這句話:申請,關閉等,當他們在簡單的演示要分開。但是當他們結合在一起時,我就變得失明瞭。

簡短的回答和長的答案都非常讚賞。 如果可能,也許可以提供一些鏈接,我可以自己學習。

在此先感謝。

代碼示例:

var async = require('async'); 

function test_waterfall() { 
    async.waterfall([ 
    function(callback) { 

     /* works - pass all */ 
     // callback(null, '1')   // null 12 
     // callback('','first')   // null 12 
     // callback(undefined,'1')  // null 12 



     /* skip second, jump to error*/ 
     // callback('error1')    // error1 undefined 
     // callback('erro1', 'value1') // error1 value1 
     // callback({})     // {} undefined 
     // callback([])     // [] undefined 

     /* wrong -- undefined is not a function*/ 
     callback() 
     // callback('') 
     // callback(undefined) 
     // callback(null) 
    }, 
    function(arg, callback) { 
     // If pass only one argument in last task, 
     //of course, the callback will be undefined. 
     callback(null, arg+'2'); 
    } 
    ], function(err, result) { 
    console.info(err) 
    console.info(result) 
    }); 
} 

test_waterfall() 
+0

你的第一個問題與在JavaScript [falsey和truthy(http://james.padolsey.com/javascript/truthy-falsey/)做。 'null,undefined,'''評估爲'false',所以不會被async視爲錯誤。 – Shanoor

回答

1

參數應匹配,因爲這是它是如何實現和API的描述說:https://github.com/caolan/async#waterfall

爲什麼你undefined is not a function,如果你不通過同樣的原因的參數數量是因爲:

  1. waterfall轉到下一task/functionresults/parameters函數在回調中返回+ extra param as a callback函數。所以:

  2. 如果讓我們說你的第一個task1回報callback(null, 1, 2);那麼接下來,你傳遞給waterfall被內部稱爲像這樣task2(1, 2, callback)而是因爲你有不同的量一樣function(param1, callback){}則params的定義你的task2居然要callback PARAM它通過2 task/function不是callback函數。所以你認爲它callback的功能,但你打電話像2(NULL,PARAM),並得到一個錯誤可以說number is not a function。如果您在task1功能通過更小(不)參數,然後在你的task2callback參數undefined,而不是你所期望的實際回調。

您可以通過參數作爲arguments對象。所以如果您task1調用callback(null, 'a', 'b'),那麼在callbackarguments[0]內部是錯誤參數(null),argument[1] == 1argument[2] == 'b'。然後他們將您的task2(argument[1], argument[2], callbackFn)和行爲連續調用爲瀑布直到最後一個函數。關於爭論你可以在這裏閱讀https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments

+0

嗨,@jonasnas你提到的這些行爲對我來說是有意義的。我在發佈這個問題時已經對他們進行了測試,是的,你是對的。 你知道它是如何實現的嗎?感謝您的回覆。 – zjalex

+0

是的,你可以通過參數傳遞參數作爲'參數'對象。所以如果你調用task1調用callback(null,'a','b'),參數[0]是錯誤參數,參數[1] == 1和參數[2] =='b'。那麼他們稱你爲task2(參數[1],參數[2],callbackFn) – jonasnas

相關問題