在nodejs中进行asynchronouscallback函数
我混淆了代码,我想模块化。 我有一个在Mongodb中实现的总账。 从john
传输信用到adam
在db.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()
。 如果是,用它来调用它。