打回来();是一个未定义的函数

时间:2015-09-21 00:53:42

标签: javascript node.js callback async.js

嘿伙计们,我在node.js中运行了这段代码:

function syncVout(transaction, vouts, Voutcallback){
async.each(vouts, function(vout, callback){
    database('vout').insert({
        'transaction': transaction,
        'value': vout['value'] * 100000000,
        'n': vout['n'],
        'asm': vout['scriptPubKey']['asm'],
        'hex': vout['scriptPubKey']['hex'],
        'reqSigs': vout['scriptPubKey']['reqSigs'],
        'type': vout['scriptPubKey']['type']
    }).then(function () {
        syncVoutAddresses(vout['scriptPubKey']['hex'], vout['scriptPubKey']['addresses'], function(){
           callback(); //<---- Error on this line!
        });
    }).catch(function(err){
        error(err + "Vouts");
       callback(); //<---- Error on this line!
    });
}, function(err, res){
    if(err){error(err + "Vouts");}
    Voutcallback();//<---- Error on this line!
});
}

function syncVoutAddresses(vouthex, addresses, callback){
    database('vout').select('id').where({'hex': vouthex}).then(function(rows){
        if(rows[0] != undefined){
            connectVoutAddress(addresses, rows[0]['id'], function(){
               callback(); //<---- Error on this line!
            });
        }else{
            callback(); //<---- Error on this line!
        }
    }).catch(function(err){
        error(err);
        callback(); //<---- Error on this line!
    });
}

修改调用syncVout

async.series([
  syncVin(rows[0]['id'], vin),
  syncVout(rows[0]['id'], vout)
], function(err, res) {
  //Write error
  if (err) {
    error(err);
  }
  callback();
});

在标记的行上我收到此错误:

Unhandled rejection TypeError: undefined is not a function

我错了什么?有人可以建议我一个让回调起作用的解决方案吗?

2 个答案:

答案 0 :(得分:0)

async.series()接受一系列函数。您的代码正在执行数组中的函数,并传递async.series()那些显然为undefined的函数的返回值。相反,您需要将syncVinsyncVout调用转换为匿名函数,以便它们可以由异步库调用,而不是由解释器立即调用。

async.series([
  function(callback) {syncVin(rows[0]['id'], vin, callback)},
  function(callback) {syncVout(rows[0]['id'], vout, callback)}
], function(err, res) {
  //Write error
  if (err) {
    error(err);
  }
  // both functions done here
});

而且,你必须确保syncVin() and syncVOut()`在完成时正确调用它们传入的回调函数。

我并不完全遵循所有其他代码,所以这可能只是您需要修复的第一件事。

答案 1 :(得分:0)

溶液:

async.series([
  function(callback) {
    syncVin(rows[0]['id'], vin, function() {
      callback();
    });
  },
  function(callback) {
    syncVout(rows[0]['id'], vout, function() {
      callback();
    });
  }
], function(err, res) {
  //Write error
  if (err) {
    error(err);
  }
  callback();
});