В настоящее время я работаю над проектом с тремя друзьями, использующими nodeJs, expressJs, MongoDB, html5,... Поскольку мы довольно новичок в этих технологиях, мы столкнулись с некоторыми проблемами. Большой проблемой, с которой я не могу найти решение, является асинхронное выполнение определенного кода.
Я хочу, чтобы для каждого цикла был закончен, так что у меня есть обновленный список друзей в Интернете, а затем выполнить 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: is Array.forEach асинхронный?), ответ заключается в том, что для каждого блокируется, но в мой пример кажется неблокирующим, потому что он выполняет res.render, прежде чем он завершит цикл? Как я могу убедиться, что для каждого из них закончен, поэтому у меня есть обновленный список друзей (и список друзей), который я могу передать, вместо передачи res.render вместо того, чтобы путь res.render происходил до завершения цикла for -each ( который дает мне неправильный список пользователей в Интернете)?
Большое спасибо!