我目前工作的一个项目有3个朋友使用的NodeJS,expressJs,MongoDB的,HTML5 ...... 因为我们是相当新的这些技术,我们遇到了一些问题。 ,我不能找到一个解决的一个大问题是某些代码的异步执行。的NodeJS,请javascript:.forEach似乎是异步的?需要同步
我想为每个循环完成一次,以便我有一个更新的在线朋友列表,并执行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?),答案是是,换每个阻塞,但在我的示例它似乎是非阻塞的,因为它在完成循环之前执行res.render? 我怎样才能确保每一个完成,所以我有一个最新的onlinefriends列表(好友列表和),我可以比传递到res.render代替res.render方式发生前的 - 每一个循环结束(这给了我一个不正确的在线用户列表)?
非常感谢!
谢谢!!这是有效的,但是这种javascript编程被认为是“不好的做法”?还是完全合法的这样工作? – Jeroen
这不是一个不好的做法,这是JavaScript的工作,你只需要如何去适应回调。不管怎么样,这显然是不干净的方法,你可以BUIL自己的功能,包装的功能,或者使用类似:HTTPS ://github.com/coolaj86/futures/tree/v2.0/forEachAsync,这也保证了函数回调的顺序(我提供的代码没有) – BFil
谢谢你,这个工作完美的我:) – thtsigma