私は現在、nodeJs、expressJs、MongoDB、html5、...を使用して、3人の友人とプロジェクトに取り組んでいます。これらのテクノロジーはかなり新しいので、いくつかの問題にぶつかりました。解決策が見つからない大きな問題は、特定のコードの非同期実行です。
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:Array.forEachは非同期ですか?)、答えはfor-eachがブロックしているということですが、私の例では、res.renderを実行する前に実行するため、ブロックされていないようです。ループが終了しましたか?for eachが終了する前にres.renderが発生する代わりに、res.renderに渡すことができる最新のオンラインフレンドリスト(およびフレンドリスト)を取得できるように、foreachが終了していることを確認するにはどうすればよいですか(これは私にオンラインユーザーの間違ったリストを与えます)?
どうもありがとう!