NodeJs, javascript: .forEach кажется асинхронным? нужна синхронизация

В настоящее время я работаю над проектом с 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 ( который дает мне неправильный список онлайн-пользователей)?

Большое спасибо!

14
задан Community 23 May 2017 в 12:10
поделиться