在nodejs中进行asynchronouscallback函数

我混淆了代码,我想模块化。 我有一个在Mongodb中实现的总账。 从john传输信用到adamdb.dummyTx追加以下文档:

 { "debitAccount": "john", "creditAccount": "adam", "amount": 10 } 

我想创build一个单一的函数transfer(from, to, amount, callback()) ,其中callback接收transaction文件/对象。

我已经使用async模块创build了以下内容:

 function transfer(from, to, amount, acallback) { async.waterfall([ function(callback) { userBalance(from); userBalance(to); callback(null); }, function(callback) { var transaction = new dummyTx(); transaction.creditAccount = from; // in the account of the sender transaction.debitAccount = to; // with reference to the reciever transaction.amount = amount; // of the given amount transaction.save(function(err) { callback(null, transaction); }); }, function(transaction, callback) { console.log("Credited User " + transaction.creditAccount + " and debited User " + transaction.debitAccount + " by amount " + transaction.amount + "credits"); callback(null, transaction); }, function(transaction, callback) { userBalance(transaction.creditAccount); userBalance(transaction.debitAccount); callback(null, transaction); } ], acallback(err, transaction) ); } 

我的理由是,如果我将function(err,transaction){if err console.log(err);}作为acallback ,它将作为最后的callback运行。 但是,它说err是未定义在acallback(err, transaction)

和我一起,我昨天刚刚发现async ,所以我是一个比喻五岁。

我的第二个想法是将函数链保存到一个名为transfer的数组中,并将其称为async(transfer,function(err,transaction){if err console.log(err)};如果我不能得到这个工作。

编辑:我也喜欢acallback参数是可选的。

如果你已经定义了函数acallback ,那么你应该通过它,而不是参数。 换句话说,而不是这个:

 ... } ], acallback(err, transaction) ); } 

…用这个:

 ... } ], acallback ); } 

为了使acallback()可选,你可以做很多事情。 有几件事情需要思考:

  • 在调用async.waterfall()之前,请检查是否定义了acallback() 。 如果不是,请将其设置为无操作function。

  • 在调用async.waterfall()之前,请检查是否定义了acallback() 。 如果不是,则在没有它的情况下调用async.waterfall() 。 如果是,用它来调用它。