[英]How can I stop for sending the promise until a for-each loop generate an array which will be send as promise
我有一个异步函数investedList
,它从数据库中查询并对数据库的结果进行一些更改。 数据库结果名称campaignList
,它是javascript对象的数组。
我想遍历数组并对此对象进行一些更改。 我可以遍历和更改对象campaignList
,但是我无法发送整个数组,因为在循环过程中,如何保证defered.resolve()
在它们之间起作用。
那么我怎样才能让事情按我的意愿运作呢?
var invest = require('../models/investment');
var Q = require('q');
var CampaignDao = require('./campaignDao');
var _ = require('underscore');
module.exports.investedList = function(data){
var defered = Q.defer();
var projection ={
_id : false,
campaignId : true,
amountInvested : true,
tokensRecieved : true,
campaignName : true
}
invest.find({investorId:data.userId},projection,function(err,campaignList){
if(err){
defered.reject(err);
}else{
var arr =[];
_.each(campaignList,function(obj){
delete obj._id;
});
_.each(campaignList , function(obj){
id=obj.campaignId;
var temp={
campaignId: obj.campaignId,
campaignName: obj.campaignName,
amountInvested: obj.amountInvested,
tokensRecieved: obj.tokensRecieved
};
CampaignDao.commonInfo(id)
.then(function(data){
temp.country = data.project.projectCountry;
temp.domain = data.project.domain;
temp.city = data.project.city;
temp.amountRaised = data.campaign.amountRaised;
arr.push(temp);
}).catch(function(err){
defered.reject(err);
});
});
defered.resolve(arr);
}
});
return defered.promise;
}
谢谢
您当前正在与_.each并行调用延迟解析。
因此,解析会在_.each甚至完成之前被调用。
而是根据某种条件在_.each内部调用resolve。 条件可以是检查您是否已完全更改对象campaignList。
您只需检查您的arr长度现在是否等于campaignList长度(这是您的循环数组),然后检查是否是resolve()
var invest = require('../models/investment');
var Q = require('q');
var CampaignDao = require('./campaignDao');
var _ = require('underscore');
module.exports.investedList = function(data){
var defered = Q.defer();
var projection ={
_id : false,
campaignId : true,
amountInvested : true,
tokensRecieved : true,
campaignName : true
}
invest.find({investorId:data.userId},projection,function(err,campaignList){
if(err){
defered.reject(err);
}else{
var arr =[];
_.each(campaignList,function(obj){
delete obj._id;
});
_.each(campaignList , function(obj){
id=obj.campaignId;
var temp={
campaignId: obj.campaignId,
campaignName: obj.campaignName,
amountInvested: obj.amountInvested,
tokensRecieved: obj.tokensRecieved
};
CampaignDao.commonInfo(id)
.then(function(data){
temp.country = data.project.projectCountry;
temp.domain = data.project.domain;\\
temp.city = data.project.city;
temp.amountRaised = data.campaign.amountRaised;
// insert object into array
arr.push(temp);
if (arr.length >= campaignList.length) {
// if array is full resolve the promise
defered.resolve(arr);
}
}).catch(function(err){
defered.reject(err);
});
});
}
});
return defered.promise;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.