I have the following two Monogoose models:
ClanMember: tag:String, name:string;
War: members:Array; #array of tags
I am currently finding an array of current members by:
ClanMember.find({
'tag': {
$in: memberTags #an array of tags
}
}).limit(memberTags.length)
.exec(function(err, members) {
}
From this I want to execute War.find()s and add that info the each member document, so like this:
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
});
After this all happens, I'd like to pass the whole new array of Member objects (with War Objects) to a view:
res.render('members', {
members: MemberArray,
});
What is the best way of ensuring that all War.find() functions are found and finished executing before passing the array to the render function?
For this you have to use promises. code should be like below.
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){
});
});
Here Promise.all() function will ensure that all previous promises has been completed. And you can give response then.