В настоящее время я работаю над проектом с 3 друзьями, используя nodeJs, ExpressJs, MongoDB, html5,... Поскольку мы довольно плохо знакомы с этими технологиями, мы столкнулись с некоторыми проблемами. Большой проблемой, для которой я не могу найти решения, является асинхронное выполнение определенного кода.
Я хочу, чтобы каждый цикл for заканчивался, чтобы у меня был обновленный список онлайн-друзей, а затем выполнялся res.render (в котором я передаю список онлайн-друзей), потому что в настоящее время он выполняет res.render до него. заканчивает петлю. Код:
function onlineFriends(req, res) {
var onlinefriends = new Array();
onlinefriends.push("mark");
FriendList.findOne({
owner: req.session.username
}, function (err, friendlist) {
friendlist.friends.forEach(function (friend) { // here forEach starts
OnlineUser.findOne({
userName: friend
}, function (err, onlineFriend) {
if (onlineFriend != null) {
onlinefriends.push(onlineFriend.userName);
console.log("a loop");
}
});
});
console.log("online friends: " + onlinefriends);
console.log("redirecting");
res.render('index', { // this is still inside the forEach function
friendlist: friendlist.friends,
onlinefriendlist: onlinefriends,
username: req.session.username
});// and here it ends
});
}
вывод будет следующим:
online friends: mark
redirecting
a loop
a loop
a loop
a loop
a loop
a loop
a loop
Как обсуждалось здесь (JavaScript, Node.js: является ли Array.forEach асинхронным?), ответ заключается в том, что для каждого блокирует, но в моем примере он кажется неблокирующим, потому что он выполняет res.render до того, как он завершит цикл? Как я могу убедиться, что for each завершен, поэтому у меня есть обновленный список онлайн-друзей (и список друзей), который я могу передать в res.render вместо того, чтобы res.render происходил задолго до завершения цикла for -each ( который дает мне неправильный список онлайн-пользователей)?
Большое спасибо!