NodeJS异步大型数据集回调

时间:2016-11-25 11:01:06

标签: angularjs node.js mongodb async.js

我在NodeJS中处理庞大的数据集时遇到问题。我使用异步,因为我想在一切都完成时调用res.send

开战:

在此项目的MongoDB集合中,可以添加广告系列。商店可以加入这些广告系列,并将该广告系列中的一些操作添加到议程中。 (比如发布Facebook消息,照片到Instagram) 在网站的前端,有一个页面显示所有活动的广告系列。打开广告系列时,必须有一个列表,其中包含加入此广告系列的所有商店。

因为每个商店都有一个议程,在哪里保存了哪些任务要做,所以我必须遍历所有商店以查看是否有一个广告系列的动作是什么等于广告系列中的ID是什么。 商店集合中有超过3500个条目,因此处理每个商店可能需要一段时间,因此我决定在页面加载时使用angular来发布该请求。

问题:

正如您在下面的代码中所看到的,我获得了所有商店,并循环浏览了这些商品。然后我遍历议程项目以查看是否存在匹配的campaignID,然后我在数组中添加一些我想要发回的信息。但代码在1店后停止。如何添加阵列中的所有商店,并在处理完所有商店后发送所有商店?

Shopmodel:

(并非所有字段)

var Shop = new Schema({
    name:String,
    email:String,
    phone: String,
    agenda:[{
        campaignId:Schema.ObjectId,
        taskId:Schema.ObjectId,
        campaignName: String,
        downloaded: Boolean,
        success: Boolean,
        startDate:Date,
        endDate:Date,
        description:String,
        kind:String
    }],
},{collection:'shop'});

控制器中的代码:

module.exports.getCampaignShop = function(req,res){
    console.log("getCampaignShop");
    var campaignId = req.query['campaignId'];
    console.log("campaignId", campaignId);
    var result = [];
    Shop.find().sort({name:1}).exec(function(err, shops){
        console.log("shop count", shops.length);
        async.eachSeries(shops, function(shop, allDone){
            async.eachSeries(shop.agenda, function(agenda, shopComplete){
                if(agenda.campaignId == campaignId){
                    var shopResult = {
                        shopId: shop._id,
                        nameSlug: shop.nameSlug,
                        logo: shop.logo,
                        name: shop.name
                    }
                    console.log("shopResult", shopResult);
                    result.push(shopResult);
                    shopComplete();
                }
            })
            allDone();
        }, function(err){
            if (err) throw err;
            console.log("result length", result.length);
            res.send(result);
        })

    })
}

1 个答案:

答案 0 :(得分:2)

问题是shopComplete仅当agenda.campaignId == campaignId为True时才会调用回调。 您需要在if block之外调用它。