2017-07-12 6 views
0

mongodbからポストを取得し、そのポストのIDを使用してポストに好きなものを取得しました、ポストライクオブジェクトにはユーザー名を含む "likedby"それを好きな人。問題は、私が投稿を取得したときに、好きになるためのコールバックが、ノードが先に走っていて、いつもDBに最後の投稿の好きなものを手に入れることができないという複雑なことです。その終わり、私のコールバックは好きに呼ばれます。これのための任意のソリューション??nodejの異常な非同期性のためにプログラムが異常に動作する

for(var i=0;i<posts.length;i++) 
    { 
     db.collection('likes',function(err,likesCollec){ 
     console.log("before likes posts[i].post",posts[i].post); 
     function wait(done){ 
      while(done); 
     } 
     done=true; 
     likesCollec.find({postid:(posts[i]._id).toString()}) 
     .toArray(function(err,likes){ 
     console.log("posts[i].post:",posts[i].post); 
     postlikes[i].post=posts[i].post; 
     console.log("postlikes[i].post: ",postlikes[i].post); 
      for(j=0;j<likes.length;j++) 
      { 
       postlikes[i].likedby[j]=likes[j].username; 
      } 
     console.log(postlikes[i]); 
     done=false; 
     wait(done); 
      }); 
     }); 
     if(i==(posts.length)-1) 
     { 
      return res.json(posts); 
     } 
    } 

待機機能が正しく動作していない可能性があります。間違った方向に行っている可能性があります。助けてください。 forEachの 非同期

答えて

0

あなたはbluebirdを使用することができます。

var Promise = require('bluebird'); 
Var p = Promise.resolve(); 
forEach(posts, function(item, index, arr) { 
    p.then(new Promise(function(resolve, reject) { 
     // do here in sync. 


      resolve(); //in last 
    })); 
}); 
p.then(function(){ 
    // all tasks launched in the loop are finished. 
    // do extra here. 
}); 
+0

です。forEachでは、私は好きなことをやります。レスポンスなどを送っていますか? – Asim

関連する問題