我有以下两种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()函数的最佳方法是什么?
答案 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已经完成。然后你可以回复。