2016-10-22 2 views
1

У меня есть этот код:Узел async.js: обратный вызов не является функцией ошибки?

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) 
+0

в вашем вместо: Регистрации: [ 'checkIfUserExist', функции (обратный вызов, результаты) { использование: Регистрация: [ 'checkIfUserExist', функции (эээ, результаты) { ** на самом деле то, что делает node.js, это сначала проверить ошибку в каждой функции, тогда она дает результат в качестве обратного вызова, что вы делаете, это то, что вы передавали обратный вызов как ошибку, к которой он дает сообщение об ошибке * * –

ответ

4

В асинхронном режиме произошел сбой, который, как вам кажется, используется. https://github.com/caolan/async/blob/master/CHANGELOG.md#breaking-changes

auto task functions now always take the callback as the last argument. If a task has dependencies, the results object will be passed as the first argument. To migrate old task functions, wrap them with _.flip

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)   
    }) 

функция (обратный вызов, результаты) должна быть функций (результаты, обратный вызов)

Пожалуйста, проверьте этот адрес для справки. https://caolan.github.io/async/docs.html#auto

+0

Все еще есть ошибки, см. Следующий комментарий ниже. Что это значит? –

+0

** В getUserName. ** ** В connectToDb. ** error = function() { if (fn === null) throw new Error («Callback уже был вызван»); var callFn = fn; fn = null; callFn.apply (это, аргументы); } Результаты = undefined ** В checkIfUserExist. ** {"getUserName": "Lem", "connectToDb": true} ** При регистрации ** {"getUserName": "Lem", "connectToDb": true , "checkIfUserExist": false} –

+0

Оказалось, что это ошибка в ориентации фигурных скобок. –

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