Node.js-等待所有Model.find()完成
我有以下两种Monogoose型号: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
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时使用回调语法一样。我把它变成了承诺。请现在试一试。