我有以下代码:
module.exports.getFinancialDashboard = function(req,res){
console.log("getFinancialDashboard");
if(req && req.query.shopSlug){
shopService.getShopFromSlug(req.query.shopSlug, function(err, shop){
var status, response;
var outStandingOrders = 0;
var nextPaymentDate = new Date();
var nextPayment =0;
var revenue = 0;
var expectedRevenue = 0;
var orderCount =0;
if(err) {
status = 500;
response = {message: 'Internal server error. ' + err};
return res.status(status).json(response);
}
Payment.find({shopId: shop._id}).exec(function(err, payments){
if(err) {
status = 500;
response = {message: 'Internal server error. ' + err};
return res.status(status).json(response);
}
async.forEachOf(payments, function(payment, i, paymentDone){
parsePayment(payment, function(err, paymentRevenue, paymentExpectedRevenue){
orderCount= i+1;
if(err){
console.log("ERROR:", err);
}
if(paymentRevenue){
revenue = revenue + paymentRevenue;
}
if(paymentExpectedRevenue){
expectedRevenue = expectedRevenue + paymentExpectedRevenue;
outStandingOrders++;
}
})
paymentDone();
}, function(){
console.log("revenue", revenue);
console.log("expected", expectedRevenue);
console.log("ordercount", orderCount, "paymentslength", payments.length);
if(orderCount == payments.length){
var dashboard = {
outStandingOrders: outStandingOrders,
nextPaymentDate: nextPaymentDate,
payment: nextPayment,
revenue: revenue,
expectedRevenue: expectedRevenue
}
console.log("DAS", dashboard);
status = 200;
response = {message: 'OK', dashboard};
return res.status(status).json(response);
}
})
})
})
}else{
return res.status(500).json({message: 'No details provided'});
}
}
function parsePayment(payment, callback){
var revenue = 0, expectedRevenue =0;
if(payment.amount > 0){
if(payment.completed && payment.exported){
console.log("completed payment");
return callback(null, payment.amount);
}else{
Order.findOne({_id: payment.orderId}).exec(function(err, order){
if (err){
return callback(err);
}
if(orderService.getOrderStatus(order) == "Send"){
console.log("sended order");
return callback(null, null, payment.amount);
}else{
return callback();
}
})
}
}
}
我希望在发回之前获得所有已解析的数据,但是尽管有回调,nodeJS仍在等待。我在我的控制台中获得以下内容:
completed payment
completed payment
completed payment
completed payment
completed payment
completed payment
completed payment
completed payment
completed payment
completed payment
completed payment
revenue 3022.6799174
expected 0
ordercount 23 paymentslength 24
sended order
正如您所看到的,我在最后一个“已发出的订单”之前获得了“收入”,“预期”和“订单数量”。 因此,ordercount不等于payments.length所以,我从未收到结果。
我已尝试使用异步库中的不同函数,如forEach和ForEachSeries,一个简单的for循环,根本没有回调,但这不起作用。
我认为这是一个简单的错误,但我找不到它。
答案 0 :(得分:2)
我认为您的代码没有等到最后一个,因为parsePayment是异步函数,您在完成之前调用paymentDone。
您需要将paymentDone放入parsePayment函数回调
{{1}}