我目前正在与 3 个朋友一起使用 nodeJs、expressJs、MongoDB、html5 进行一个项目……由于我们对这些技术还很陌生,因此遇到了一些问题。我找不到解决方案的一个大问题是某些代码的异步执行。
我想要一个 for each 循环完成,以便我有一个更新的在线朋友列表,然后执行 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 asynchronous?),答案是 for-each 是阻塞的,但在我的示例中,它似乎是非阻塞的,因为它在执行 res.render 之前它有完成循环?如何确保 for each 已完成,以便我有一个最新的 onlinefriends 列表(和friendlist),然后我可以将其传递给 res.render 而不是 res.render 在 for -each 循环完成之前发生的方式(这给了我一个不正确的在线用户列表)?
非常感谢!