Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js-等待所有Model.find()完成_Node.js_Express_Mongoose - Fatal编程技术网

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

Node.js-等待所有Model.find()完成,node.js,express,mongoose,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

我有以下两种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()
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

});
在这一切发生之后,我想将整个新的成员对象数组(带有War对象)传递给一个视图:

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

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

为此,必须使用承诺。 代码应该如下所示

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){

      });

});

函数将确保以前的所有承诺都已完成。然后你可以做出回应。

为此,你必须使用承诺。 代码应该如下所示

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){

      });

});

函数将确保以前的所有承诺都已完成。然后您可以给出答复。

请选择我的答案或答案。然而,这对我来说不太管用。
warPromise
中的
currentMember
变量始终是数组中最后一个
member
元素。。e、 g.如果我
console.log(currentMember.tag
)`返回相同的标记..我已经编辑了我的答案,它现在可以工作了。。正如您在查找WAR时使用回调语法一样。我把它变成了承诺。请立即尝试。请选择我的答案或其他答案。然而,这对我来说不太管用。
warPromise
中的
currentMember
变量始终是数组中最后一个
member
元素。。e、 g.如果我
console.log(currentMember.tag
)`返回相同的标记..我已经编辑了我的答案,它现在可以工作了。。正如您在查找WAR时使用回调语法一样。我把它变成了承诺。请现在试一试。