NodeJS 异步大数据集回调
NodeJS async large dataset callback
我在使用 NodeJS 处理大型数据集时遇到问题。我正在使用异步,因为我想在一切完成后调用 res.send
。
原因:
在此项目的 MongoDB 集合中,可以添加活动。商店能够加入这些活动并将该活动中的一些操作添加到议程中。 (喜欢 post Facebook 消息,照片到 Instagram)
在网站的前端,有一个页面显示所有活动的活动。当一个活动开启时,必须有一个列表,其中包含所有加入此活动的商店。
因为每个商店都有一个议程,其中保存了要执行的任务,我必须遍历所有商店以查看是否有一个活动的 campaignId 等于来自活动的 ID what is open。
商店集合中有超过 3500 个条目,因此处理每个商店可能需要一段时间,所以我决定在加载页面时使用 angular 到 post 该请求。
问题:
正如您在下面的代码中看到的,我获取了所有商店,并循环遍历了这些项目。然后我遍历议程项目以查看是否有匹配的 campaignID,然后我在数组中添加一些我想要发回的信息。但代码在 1 家商店后停止。如何将所有商店添加到数组中,并在处理完所有商店后全部发送?
店铺型号:
(并非所有字段)
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);
})
})
}
问题是 shopComplete
仅当 agenda.campaignId == campaignId
为 True 时才会调用回调。
您需要在 if block
.
之外调用它
我在使用 NodeJS 处理大型数据集时遇到问题。我正在使用异步,因为我想在一切完成后调用 res.send
。
原因:
在此项目的 MongoDB 集合中,可以添加活动。商店能够加入这些活动并将该活动中的一些操作添加到议程中。 (喜欢 post Facebook 消息,照片到 Instagram) 在网站的前端,有一个页面显示所有活动的活动。当一个活动开启时,必须有一个列表,其中包含所有加入此活动的商店。
因为每个商店都有一个议程,其中保存了要执行的任务,我必须遍历所有商店以查看是否有一个活动的 campaignId 等于来自活动的 ID what is open。 商店集合中有超过 3500 个条目,因此处理每个商店可能需要一段时间,所以我决定在加载页面时使用 angular 到 post 该请求。
问题:
正如您在下面的代码中看到的,我获取了所有商店,并循环遍历了这些项目。然后我遍历议程项目以查看是否有匹配的 campaignID,然后我在数组中添加一些我想要发回的信息。但代码在 1 家商店后停止。如何将所有商店添加到数组中,并在处理完所有商店后全部发送?
店铺型号:
(并非所有字段)
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);
})
})
}
问题是 shopComplete
仅当 agenda.campaignId == campaignId
为 True 时才会调用回调。
您需要在 if block
.