【问题标题】:TypeError: object is not a function with async.waterfallTypeError: object is not a function with async.waterfall
【发布时间】:2023-11-19 19:47:02
【问题描述】:

我是一个尝试使用 async.waterfall 的 node.js 菜鸟。 从瀑布数组的最后一个任务到最终的回调方法,我遇到了问题。

在下面的示例中,我将回调传递给doSomethingAsync,但是当我想在doSomethingAsync 中执行回调时,我得到TypeError: object is not a function。我不明白。谢谢你的想法

编辑

瀑布的第一个任务是创建一个 Mongo 文档。 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

【问题讨论】:

    标签: javascript node.js asynchronous


    【解决方案1】:

    我的猜测是问题出在您已删除的代码上。更具体地说,您可能在您展示的调用 doSomethingAsync() 的函数之前在瀑布中拥有一个函数。

    async.waterfall() 的工作方式是将传递给回调的任何参数传递给函数列表中的下一个函数。所以前一个函数可能正在执行类似callback(null, { foo: 'bar' }) 的操作,而下一个函数中的callback 参数实际上是{ foo: 'bar' },第二个参数是真正的回调。这实际上取决于您之前传递给回调的参数数量。

    因此,假设您只传递 1 个项目,您将更改函数定义:

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

    到:

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

    【讨论】:

    • 我确实忽略了瀑布的第一个任务。你能看看编辑吗?我知道“回调”是另一种类型的对象,但我不明白我的语法有什么问题。
    • @NathanZ 在瀑布的第二个函数中,第一个参数需要是传递给第一个函数回调的结果。在这种情况下,它是保存的会话。第二个函数需要function(savedSession, callback){...
    • 从阅读the mongoose code 看来,传递给.save() 的函数实际上被赋予了3 个参数:错误对象(如果有)、保存的模型和numberAffected。所以我认为你的第二个函数需要有function (savedSession, numAffected, callback) {的签名。