2016-11-25 64 views
0

我在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

回答

2

的問題shopComplete回調得到調用,只有當agenda.campaignId == campaignId爲True。 您需要在if block之外調用它。

+0

是啊!這就是訣竅! – NVO

+0

也建議NVO運行同步循環,而不是'async.eachSeries(shop.agenda,function(agenda,shopComplete){'因爲我看不出爲什麼你需要異步。 –