NodeJS异步大数据集回调

问题描述:

我在NodeJS中处理一个巨大的数据集时遇到了问题。我正在使用异步,因为我想在完成所有事情时调用res.sendNodeJS异步大数据集回调

casus:

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

因为每个商店都有一个议程,我要保存哪些任务要做的地方,我必须通过所有商店循环查看是否有活动与活动相关,与活动中打开的活动ID相同。 商店收藏中有超过3500个条目,所以在处理每个商店时可能需要一段时间,所以我决定在页面加载时使用angular来发布该请求。

问题:

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

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); 
     }) 

    }) 
} 
+0

您是否试图编写一个仅返回商店的请求,其中议程中的大于1的元素具有与您想要的相同的选项? MongoDB可以缓解你很多时间 – DrakaSAN

的问题shopComplete回调得到调用,只有当agenda.campaignId == campaignId为True。 您需要在if block之外调用它。

+0

是啊!这就是诀窍! – NVO

+0

也建议NVO运行同步循环,而不是'async.eachSeries(shop.agenda,function(agenda,shopComplete){'因为我看不出为什么你需要异步。 –