【问题标题】:Failed to construct async operation in node.js在 node.js 中构造异步操作失败
【发布时间】:2017-07-02 11:54:59
【问题描述】:

我想使用并行而不是瀑布来进行操作。

我用过猫鼬,我有一个像这样的模型的方法

module.exports.updateStatus = function(task_id, status, callback){
    Task.findOneAndUpdate({_id: task_id}, 
        {$set: {status}},
        {upsert: true,'new':true},
        callback)
}

那为什么我在第 2 行得到了意外的令牌?

async.parallel([
    Task.updateStatus(id, status, (err, resp), callback) => {
        callback(err, resp)
    },
    Credit.addCredit(user_id, 10, (err, resp), callback) => {
        callback(err, resp)
    }
], (err, resp) => {
    if(err){
        return handleError(err, 'Failed to update task status', res)
    }

    res.json({
        success: true,
        result: {task: resp}
    })
})

【问题讨论】:

    标签: javascript node.js ecmascript-6


    【解决方案1】:

    这是无效部分:

    async.parallel([
        Task.updateStatus(id, status, (err, resp), callback) => {
            callback(err, resp)
        },
        Credit.addCredit(user_id, 10, (err, resp), callback) => {
            callback(err, resp)
        }
    ]
    

    你同时给它两个回调,试试:

    async.parallel([
        function(callback) { Task.updateStatus(id, status, (err, resp), callback) }
        function(callback) { Credit.addCredit(user_id, 10, (err, resp), callback) }
    ]
    

    相反,我们从异步函数中获取回调参数。

    【讨论】:

      【解决方案2】:

      你的语法错误,async parllel 接收函数数组,每个函数都有一个回调,需要传递给函数,一旦当前函数完成就会被调用。

      您正在尝试调用函数,您需要在其中传递一组任务,以便每个任务都会调用函数,并且您将错误的参数传递给这些任务。请查看文档async parallel 并找到下面的示例。

      async.parallel([
              function(callback){
                  updateStatus(id, status, callback)
              },
              function (callback) {
                  addCredit(user_id, 10, callback)
              }], (err, resp) => {
                  if(err){
                      return handleError(err, 'Failed to update task status', res)
                  }
                  res.json({
                      success: true,
                      result: {task: resp}
                  })
          });
      

      【讨论】:

      • 如果我在 updateStatus 中有错误怎么办? addCredit 会执行吗?
      • 如果任何函数将错误传递给其回调,则会立即调用主回调,并显示错误。如果你想继续,你可能想使用 async each,并决定是否调用回调,收到错误。
      • 所以我的错误句柄是正确的?为什么有些人在做 try catch and throw new Error()?
      • 如果您从其中一项任务中收到错误,将调用 handleError 并且不会返回 res,如果这是您想要的,那么这是正确的。有时,决定如何处理错误不是当前函数的责任,因此您只需将其重新抛出给被调用者,直到有人处理它。
      猜你喜欢
      • 2018-09-29
      • 2017-06-17
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      相关资源
      最近更新 更多