2015-02-09 39 views
1

我是一個node.js noob嘗試使用async.waterfall。 我有問題從瀑布陣列的最後一個任務到最終的回調方法。TypeError:對象不是具有async.waterfall的函數

在下面的示例中,我將回調傳遞給doSomethingAsync,但是當我想在doSomethingAsync內執行回調時,我得到TypeError: object is not a function。我不明白。感謝您的想法

編輯

瀑布的第一項任務是蒙戈文檔的創建。 save()函數的回調是function(err){...}

var session = createSession(); // session is a Mongoose model 
async.waterfall([ 

    function (callback) { 
     ... 
     session.save(callback); // Model.save(function(err){...} 
    }, 

    function (callback) { 
     doSomethingAsync(session, callback) 
    } 

], function (err, session) { 


}); 

function doSomethingAsync(session, callback){ 
    doSomething(function(err){ 
     callback(err,session); 
    } 
} 


callback(err,session); 
^ 
TypeError: object is not a function 

回答

6

我的猜測是問題在於你已經刪除的代碼。更具體地說,您可能在瀑布前的瀑布中有一個函數,在您顯示的函數調用doSomethingAsync()之前。

工作方式async.waterfall()的工作方式是將傳遞給回調的任何參數傳遞給函數列表中的下一個函數。所以前面的函數可能會做類似callback(null, { foo: 'bar' })callback參數在下一個函數實際上是{ foo: 'bar' }和第二個參數是真正的回調。這實際上取決於您之前通過回調傳遞了多少個參數。

function (callback) { 
    doSomethingAsync(session, callback) 
} 

到:

所以,假如你只是通過1項,您將函數定義從改變

function (someResult, callback) { 
    doSomethingAsync(session, callback) 
} 
+0

我確實省略了瀑布的第一項任務。你可以看看編輯嗎?我明白'回調'是另一種類型的對象,但我不明白我的語法有什麼問題。 – znat 2015-02-09 13:31:34

+0

@NathanZ在瀑布的第二個函數中,第一個參數需要是傳遞給第一個函數回調的結果。在這種情況下,它是保存的會話。第二個函數需要'function(savedSession,callback){...' – cdbajorin 2015-02-09 13:37:51

+0

從閱讀[mongoose代碼](https://github.com/LearnBoost/mongoose/blob/dd4f05dbeb9cd144071209f38a465e86377d9164/lib/model.js#L163 ),看起來傳遞給'.save()'的函數實際上有3個參數:錯誤對象(如果有),保存的模型和numberAffected。所以我認爲你的第二個函數需要有'function(savedSession,numAffected,callback){'的簽名。 – mscdex 2015-02-09 14:35:05

相關問題