繁体   English   中英

我如何停止发送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并行调用延迟解析。

因此,解析会在_.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM