我建造的网络应用程序将每三个月向客户发送一张发票。这将是一个在半夜运行的预定事件,但在开发中我已将此代码放入路由中,以便我可以测试它。
简而言之,我希望代码能够执行以下操作。
sent: true
。async.waterfall
以下代码有效。但我对_.each
有些担忧。
invoices.post('/invoices/send/', function(req, res, next) {
async.waterfall([
// Query all unsent invoices
function(callback) {
db.invoices.find({sent: false}).toArray(callback);
},
// Send all unsent invoices
function(invoices, callback) {
if (invoices.length === 0) {
var err = new Error('There are no unsent invoices');
err.status = 400;
return next(err); //Quick escape if there are no matching invoice to process
}
// Make a call to Mandrill transactional email service for every invoice.
_.each(invoices, function(invoice) {
mandrillClient.messages.sendTemplate({template_name: "planpal-invoice", template_content: null, message: mandrillClient.createInvoiceMessage(invoice)}, function(sendResult) {
console.log(sendResult);
db.invoices.updateById(invoice._id, {$set: {sent: true}}, function(err, saveResult) {
console.log(saveResult);
});
}, function(err) {
return next(err);
});
});
callback(null, 'done');
}
],
function(err, result) {
if (err) {
return next(err);
}
res.json(result);
});
});
我认为我应该使用async.eachLimit
而不是......但我不知道如何写它。
我不知道我应该设置限制,但是我猜几个并行请求比在上面的系列中运行所有mandrill请求更好,我错了吗? EDIT _.each
并行运行回调。与async.each
的区别在于我没有得到#34;最终回调"
结论:我应该使用上面的async.eachLimit
吗?如果是,那么什么是良好的限值?