【问题标题】:Node async.js: callback is not a function error?节点 async.js:回调不是函数错误?
【发布时间】:2017-03-04 12:15:00
【问题描述】:

我有这个代码:

async = require('async')

async.auto({
   getUserName: function(callback) {
      console.log('**In getUserName.**')
      callback(null, 'Lem')
   },

   connectToDb: function(callback) {
      console.log('**In connectToDb.**')
      var connected = true
      if(connected) {
        callback(null, connected)
      } else {
        callback('Error connecting to DB.', null)
      }
   },

   checkIfUserExist: [
      'getUserName',
      'connectToDb',
      function(callback, results) {
         console.log('**In checkIfUserExist.**',          
            JSON.stringify(results))
         var userExist = false
         if(userExist) {
            callback('User exist in DB.')
         } else {
            setTimeout(
               function() {
                  callback(null, userExist);
               },
               1000
            );
         }
      }
   ],

   signup: [
      'checkIfUserExist',
      function(callback, results) {
         console.log('**In signup**', JSON.stringify(results))
         var userName = results.getUserName
         var isDbConnected = results.connectToDb
         var userExist = result.checkIfUserExist

        if(userName && isDbConnected && !userExist) {
           callback(null, 
             {'status': '200', 'msg': 'Successfully signed up user'})
       } else {
          callback('Error signing up user.', null)
       }
    }
  ]
 },
 function(error, results) {
    console.log('error = ', error)
    console.log('results = ', results)

})

为什么我会遇到这个错误:

**In getUserName.**
**In connectToDb.**
error =  function () {
    if (fn === null) throw new Error("Callback was already called.");
        var callFn = fn;
        fn = null;
    callFn.apply(this, arguments);
}
results =  undefined
**In checkIfUserExist.** undefined
^[[A/home/lem/js/async/asyncAuto.js:30
        callback(null, userExist);
        ^

TypeError: callback is not a function
   at Timeout._onTimeout (/home/lem/js/async/asyncAuto.js:30:13)
   at ontimeout (timers.js:365:14)
   at tryOnTimeout (timers.js:237:5)
   at Timer.listOnTimeout (timers.js:207:5)

【问题讨论】:

  • 在你的而不是:注册:['checkIfUserExist',函数(回调,结果){使用:注册:['checkIfUserExist',函数(错误,结果){实际上是什么节点。 js 所做的是它首先检查每个函数中的错误,然后将结果作为回调给出你所做的就像你将回调作为错误传递给它给你一个错误消息

标签: node.js async.js


【解决方案1】:

一个异步函数,一个期望回调作为其最后一个参数的函数。这是我的工作代码。

    var async = require('async');
         async.auto({
           getUserName: function(callback) {
            console.log('**In getUserName.**')
            callback(null, 'Lem')
           },

         connectToDb: function(callback) {
          console.log('**In connectToDb.**')
          var connected = true
          if(connected) {
            callback(null, connected)
          } else {
            callback('Error connecting to DB.', null)
          }
       },
       checkIfUserExist: [
          'getUserName',
          'connectToDb',
          function(results, callback) {
             console.log('**In checkIfUserExist.**',          
                JSON.stringify(results))
             var userExist = false
             if(userExist) {
                callback('User exist in DB.')
             } else {               
                setTimeout(function() {                 
                      callback(null, userExist);
               },1000);
             }
          }
       ],

       signup: [
          'checkIfUserExist',
          function(results, callback) {
             console.log('**In signup**', JSON.stringify(results))
             var userName = results.getUserName
             var isDbConnected = results.connectToDb
             var userExist = results.checkIfUserExist

            if(userName && isDbConnected && !userExist) {
               callback(null, 
                 {'status': '200', 'msg': 'Successfully signed up user'})
           } else {
              callback('Error signing up user.', null)
           }
        }
     ],
},
     function(error, results) {
        console.log('error = ', error)
        console.log('results = ', results)         
    })

function(callback, results) 应该是 function(results, callback)

请查看此网址以供参考。 https://caolan.github.io/async/docs.html#auto

【讨论】:

  • 仍有错误,请参阅下面的下一条评论。这是什么意思?
  • 在 getUserName. 在 connectToDb. error = function () { if (fn === null) throw new Error("Callback was already调用。"); var callFn = fn; fn = 空; callFn.apply(this, arguments); } 结果 = 未定义 在 checkIfUserExist. {"getUserName":"Lem","connectToDb":true} 在注册中 {"getUserName":"Lem","connectToDb" :true,"checkIfUserExist":false}
  • 原来是花括号的方向错误。
  • 是的,缺少花括号,我已经更新了代码,现在很好。
【解决方案2】:

在 v2 中 async 的 auto 方法发生了重大变化,您似乎在使用它。 https://github.com/caolan/async/blob/master/CHANGELOG.md#breaking-changes

自动任务函数现在总是将回调作为最后一个参数。如果任务具有依赖关系,则结果对象将作为第一个参数传递。要迁移旧的任务函数,请用 _.flip 包装它们

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-09
    • 2015-10-20
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 2018-07-15
    相关资源
    最近更新 更多