由于nodejs的奇怪的异步性质,程序表现异常

时间:2017-07-12 11:20:45

标签: node.js mongodb asynchronous database

我从mongodb收到帖子然后使用该帖子的ID我在帖子上得到了喜欢的帖子,我的postlikes对象包含一个"帖子"和#34;喜欢"包含喜欢它的人的用户名的数组。问题在于,当我收到帖子时,获取相关内容的回调在某种程度上是复杂的,这就是为什么节点会提前运行而我无法获得喜欢的内容我总是喜欢数据库中的最后一个帖子,主要是因为循环已经到了结束然后我的回调被称为喜欢。任何解决方案?

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);
        }
    }

等待功能没有正常工作也许我会走错方向,请帮忙。

2 个答案:

答案 0 :(得分:0)

使用async forEach https://www.npmjs.com/package/async

async = require('async');
async.forEach(posts,function(post, callback){
      // Do functionality here
      return callback();
})

答案 1 :(得分: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.
});