我怎样才能停止发送promise,直到for-each循环生成一个将作为promise发送的数组
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的延迟解析。
所以在_之前调用resolve。每一个都完成了。
在_内部调用resolve。每一个都是基于一些条件。条件可以检查是否完全更改了对象campaignList。
可以检查arr的长度是否等于循环数组的长度如果等于则执行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;
}
相关文章:
- 将一个方法转换为promise:Nodejs
- 将其中一个异步方法重写为使用promise的方法
- 通过AngularJS promise下载一个文件
- promise.all在一个forEach循环中——所有东西都同时启动
- 多次调用promise函数,直到另一个promise函数满足条件
- 我可以克隆一个Promise吗
- 创建一个空的JavaScript Promise
- 与 promise 一起使用时,异步瀑布不执行下一个回调方法
- 使用 Promise 在另一个函数中调用带有 Bluebird 承诺库的函数
- 如何通过一个回调异步排队和执行多个promise
- 当使用promise时,为什么最后一个会被调用
- 如何访问AngularJS promise链中上一个promise的结果
- Promise.all()方法没有't解析为一个值
- Ember.js:路由返回多个模型,包括一个promise,给出错误
- Promise.promisify不是一个函数
- 在循环中使用 q promise 的最佳方法是什么?等待链完成,然后再迭代到下一个
- 如何使用 Parse.promise javascript 定义一个承诺数组并获取结果数组 [parse.com]
- 使用 Promise.map 返回一个与 bluebird “订购”的对象
- 然后,在前一个完成之前调用 Promise
- Complex Q promise:一个promise创建了一个其他promise的数组