2016-07-17 7 views
0

in model.findone私は3つの要素からなる配列を取得しています。他の部分では、私は各項目をループしています&その特定の項目のオファーヘッドです。deferred.resolve()はforループ内の最後の要素を反復していません

しかし、私はただ2つのオファー頭を得ることができます。最後のオファー頭を取り出すことはできません。 私のコードに問題はありますか?

function getOfferingsHeads(id) { 
    var deferred = Q.defer(); 
    var offeringHeads = []; 
    model 
    .findOne({ _id: id }) 
    .exec(function (err, item) { 
     if(err) { 
      console.log(err); 
      deferred.reject(err); 
     } 
     else { 
      // deferred.resolve(item.offerings); 
      // var offeringsList = []; 
      // offeringsList = item.offerings; 

      for (var i = 0; i < item.offerings.length; i++) { 
       executivesModel 
       .findOne({offName: item.offerings[i] }) 
       .exec(function(err1, item1) { 
        if(err1){ 
         console.log(err1); 
         deferred.reject(err1); 
        } 
        else{ 
         offeringHeads.push(item1.offHead); 
         deferred.resolve(offeringHeads); 
        } 
       }); 
      } 
     } 
    }); 
    return deferred.promise; 
} 

答えて

0

ないこれがあなたの意図したものですが、あなたが複数回同じ約束を解決していることを確認します。

最新バージョンのmongooseを使用すると、Promiseライブラリを使用するように設定できます。ここで

は、私はあなたがするもので信じるものに訂正です:

//Somewhere near mongoose definition 
mongoose.Promise = require('q').Promise; 

function getOfferingsHeads(id) { 
var offeringHeads = []; 
return model 
.findOne({ _id: id }) 
.then(function (item) { 
    if(!item) { 
    //Handle no results 
    return Q.reject() 
    } 
    else { 
     return Q.all(item.offerings.map(function(offering){ 
     executivesModel 
      .findOne({offName: offering.name}) 
     })); 
    } 
}); 
} 

//Now you can use 
getOfferingsHeads('someId').then(function (offerings) { 
... 
}); 
2

遅延を2回以上解決することはできません。一般に、遅延は一切使用しないでください。 mongooseは有望なAPIを持っているので、それを使うだけです。それははるかにクリーンなコードを行います:

function getOfferingHead(offName) { 
    return executivesModel 
     .findOne({offName: offName }) 
     .exec() 
     .then(function (item) { 
      return item.offHead; 
     }); 
} 

function getOfferingsHeads(id) { 
    return model 
     .findOne({ _id: id }) 
     .exec() 
     .then(function (item) { 
      return Q.all(item.offerings.map(getOfferingHead)); 
     }); 
} 

を機能使用するには:

getOfferingsHeads('myId').then(function (heads) { 
    console.log(heads); 
}); 
関連する問題