2016-10-21 6 views
0

私はデータベースから照会された非同期関数investedListを持っており、結果をデータベースから変更しています。データベース結果名 - campaignListは、javascriptオブジェクトの配列です。for-eachループが約束通りに送信される配列を生成するまで、約束を送るのを止めることができます

私は配列を横断して、このオブジェクトをいくつか変更したいと思っています。私は、トラバースしてオブジェクト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; 
} 

おかげ

+0

を確認することができます。このコードの代わりに[最小で完全で検証可能な例](http://stackoverflow.com/help/mcve)を作成できますか? –

答えて

1

現在_.eachへの遅延解決平行を呼んでいます。

したがって、解決は_.eachが完了する前に呼び出されます。

代わりに、何らかの条件に基づいて_.each内でresolveを呼び出します。条件は、あなたがオブジェクトcampaignListを完全に変更したかどうかをチェックすることです。

0

あなたのARRの長さは、今では(解決を行うことであるならば、あなたのループ配列である等しいcampaignList長である場合、あなたはあなたのコードを逮捕するために、現在非常に困難である)

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; 
} 
関連する問題