在nodejs中制作异步回调函数
Making async callback functions in nodejs
我有一些令人困惑的代码,我想将其模块化。我有一个在 Mongodb 中实现的总分类帐。将学分从 john
转移到 adam
会在 db.dummyTx
中附加以下文档:
{
"debitAccount": "john",
"creditAccount": "adam",
"amount": 10
}
我想创建一个函数 transfer(from, to, amount, callback())
,其中回调接收 transaction
document/object。
我使用 async
模块创建了以下内容:
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
传递,它将 运行 作为最后的回调。但是,它说 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()
。如果不是,请将其设置为无操作函数。
在调用async.waterfall()
之前,检查是否定义了acallback()
。如果不是,请在没有它的情况下调用 async.waterfall()
。如果是,用它调用它。
我有一些令人困惑的代码,我想将其模块化。我有一个在 Mongodb 中实现的总分类帐。将学分从 john
转移到 adam
会在 db.dummyTx
中附加以下文档:
{
"debitAccount": "john",
"creditAccount": "adam",
"amount": 10
}
我想创建一个函数 transfer(from, to, amount, callback())
,其中回调接收 transaction
document/object。
我使用 async
模块创建了以下内容:
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
传递,它将 运行 作为最后的回调。但是,它说 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()
。如果不是,请将其设置为无操作函数。在调用
async.waterfall()
之前,检查是否定义了acallback()
。如果不是,请在没有它的情况下调用async.waterfall()
。如果是,用它调用它。