节点不等待回调

时间:2017-09-20 07:03:49

标签: javascript node.js callback

我有以下代码:

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循环,根本没有回调,但这不起作用。

我认为这是一个简单的错误,但我找不到它。

1 个答案:

答案 0 :(得分:2)

我认为您的代码没有等到最后一个,因为parsePayment是异步函数,您在完成之前调用paymentDone。

您需要将paymentDone放入parsePayment函数回调

{{1}}