Node.js - 等待所有Model.find()完成

时间:2017-04-05 17:55:59

标签: node.js express mongoose

我有以下两种Monogoose型号:

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()并将该信息添加到每个成员文档中,如下所示:

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

});

在这一切发生之后,我想将全新的Member对象数组(带有War Objects)传递给视图:

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

在将数组传递给渲染函数之前,确保找到并完成所有War.find()函数的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

为此你必须使用promises。 代码应如下所示。

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()函数将确保所有先前的promise已经完成。然后你可以回复。