异步是在最后一项之前调用回调?

时间:2017-06-22 11:58:16

标签: node.js callback async.js

我有一个async.eachSeries()函数来处理对象列表。在列表之后我想要一个res.send()函数,这样我就可以将结果发送回前端。 但是我得到了一个

  

'发送后无法设置标题'

res.send()行上的

错误,它看起来在完全处理列表之前调用了该函数。

module.exports.createOrder = function(req,res){
    console.log("CreateOrder");
    var orderDescription = "";
    var payId = new ObjectId(); //create one id, to pay multiple orders at one time    
    var shopList = groupByShop(req.body.cart);
    var orders = [];
    var result = {};
    console.log("before async");
    //the cart is now sorted by shop, now we can make orders for each shop
    async.eachSeries(Object.keys(shopList), function(key, callback){
        console.log("in async");
        var shop = shopList[key];
        console.log("before saveOrder");
        saveOrder(payId, shop, key, req.body, req.user, function(err, newOrder){
            console.log("in saveorder");
            if(err){
                console.log("Err", err);
                callback(err);
            }else{
                console.log("order saved");
                orders.push(newOrder);
                callback();
            }
        })
    }, function(err){
        if(err){
            console.log("One or more orders are not saved:", err);
            return res.status(400).json(err);
        }else{
            console.log("All orders are processed");
            result = {
                message: 'OK',
                order: {
                    payId: orders[0].payId
                }
            };
            return res.send(200).json(result);
        }       
    })
}

这里出了什么问题?目前正在使用“shopList”中的一个对象进行测试,并且所有日志行都在服务器控制台中可见。

当我删除该行时,该功能正常,但当然,他没有发送任何结果。我也尝试将该行移到函数外部,但这当然会导致空result{}和函数完成前的发送。

1 个答案:

答案 0 :(得分:1)

res.send(200)会发送内容为“200”的HTML回复 - 您要做的是res.status(200).json(result),尽管res.json(result)也可以正常使用。