2015-02-09 5 views
1

Я узел.js noob, пытающийся использовать async.waterfall. У меня проблемы с последней задачей массива водопада до окончательного метода обратного вызова.TypeError: объект не является функцией с async.waterfall

В приведенном ниже примере передается обратный вызов doSomethingAsync, но когда я хочу выполнить обратный вызов внутри doSomethingAsync, я получаю TypeError: object is not a function. Я не понимаю. Спасибо за ваши мысли

EDIT:

Первая задача водопада является создание документа Монго. Обратный вызов функции 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' }, а второй аргумент - это реальный обратный вызов. Это действительно зависит от того, сколько аргументов вы передали ранее обратному вызову.

Так если вы просто передать 1 деталь, то вы бы изменить определение функции от:

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

к:

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

Я действительно опущена первая задача водопада. Не могли бы вы посмотреть на редактирование? Я понимаю, что «обратный вызов» - это объект другого типа, но я не понимаю, что не так в моем синтаксисе. – znat

+0

@NathanZ во второй функции водопада, первым аргументом должен быть результат, который передается на обратный вызов первой функции. В этом случае это сохраненный сеанс. Вторая функция должна быть 'function (savedSession, callback) {...' – cdbajorin

+0

Из чтения [кода мангуста] (https://github.com/LearnBoost/mongoose/blob/dd4f05dbeb9cd144071209f38a465e86377d9164/lib/model.js#L163), похоже, что функция, переданная в '.save()', фактически дается 3 аргумента: объект ошибки (если есть), сохраненная модель и numberAffected. Поэтому я думаю, что ваша вторая функция должна иметь подпись 'function (savedSession, numAffected, callback) {'. – mscdex

Смежные вопросы