我怎样才能停止发送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

本文关键字:promise 一个 数组 for-each 循环 直到      更新时间:2023-09-26

我有一个异步函数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;
}