2017-04-05 5 views
0

を完了するために、すべてのModel.findを待っている私持って、次の2つのMonogooseモデル:Node.jsのは、 - ()

ClanMember: tag:String, name:string; 
War: members:Array; #array of tags 

私は現在で現在のメンバーの配列を発見しています:

ClanMember.find({ 
    'tag': { 
     $in: memberTags #an array of tags 
    } 
}).limit(memberTags.length) 
    .exec(function(err, members) { 

} 

このことから私は、War.find() Sを実行し、その情報を各メンバーのドキュメントを追加したい、このようなので:

ClanMember.find({ 
    'tag': { 
     $in: memberTags 
    } 
}).limit(memberTags.length) 
    .exec(function(err, members) { 

    var MemberArray = []; 
    for (var member in members) { 
     if (members.hasOwnProperty(member)) { 
      var currentMember = members[member]; 
      War.find({members: currentMember.tag}).exec(function(err, wars) { 
       currentMember.wars = wars; 
       MemberArray.push(currentMember); 
      }); 
     } 
    } 

    #I WANT TO RENDER HERE 

}); 

res.render('members', { 
     members: MemberArray, 
    }); 

すべてWar.find()関数が発見されていることを保証する最善の方法は何ですか:すべてが起こるこれは、私は、ビューに(戦争オブジェクトとの)メンバーオブジェクトの全く新しい配列を渡したいのですがレンダリング関数に配列を渡す前に実行を終了しましたか?

答えて

3

これについては、約束をする必要があります。 コードは以下のようになります。

var Promise = require('promise'); 
ClanMember.find({ 
    'tag': { 
     $in: memberTags 
    } 
}).limit(memberTags.length) 
    .exec(function(err, members) { 
    var promises = []; 
    var MemberArray = []; 
    members.forEach((member)=>{ 
      var currentMember = member; 
      let warPromise = War.find({members: currentMember.tag}).exec().then(function(wars) { 
       currentMember.wars = wars; 
       MemberArray.push(currentMember); 
       return true; 
      }).catch(function(err){ 
       throw err; 
      }); 
      promises.push(warPromise); 
     } 
    }); 


    Promise.all(promises).then(function(result){ 
     #I WANT TO RENDER HERE 

     }).catch(function(err){ 

     }); 

}); 

ここで、Promise.all()関数は、すべての前回の約束事が完了したことを保証します。そして、あなたはそれに応答することができます。

+0

私の回答も選択してください –

+0

ありがとうございました。しかしこれは私のためにはうまくいきません。 'warPromise'内の' currentMember'変数は常に配列の最後の 'member'要素です。私は 'console.log(currentMember.tag')'同じタグが返された場合.. – GarethPrice

+0

私は今どこで戦闘を見つけるときにコールバック構文を使用するように私の答えを編集しました。私はそれを約束に変えた。今すぐお試しください。 –