मैं वर्तमान में नोडजे, एक्सप्रेसजे, मोंगोडीबी, एचटीएमएल 5, ... का उपयोग कर 3 दोस्तों के साथ एक परियोजना पर काम कर रहा हूं ... चूंकि हम इन प्रौद्योगिकियों के लिए बिल्कुल नए हैं, इसलिए हम कुछ समस्याओं में फंस गए हैं। एक बड़ी समस्या जिसे मैं समाधान नहीं ढूंढ पा रहा हूं वह कुछ कोड के असीमित निष्पादन है।नोडजेस, जावास्क्रिप्ट: .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 निष्पादित करता है? मैं यह कैसे सुनिश्चित कर सकता हूं कि प्रत्येक के लिए समाप्त हो गया है, इसलिए मेरे पास एक अद्यतित ऑनलाइन मित्र सूची (और मित्रसूची) है जो मैं res.render के बजाय res.render के पास हो सकता है, क्योंकि पहले लूप खत्म हो जाता है (जो मुझे ऑनलाइन उपयोगकर्ताओं की गलत सूची देता है)?
बहुत बहुत धन्यवाद!
धन्यवाद !! यह काम करता है, लेकिन जावास्क्रिप्ट में इस प्रकार का प्रोग्रामिंग "खराब अभ्यास" के रूप में माना जाता है? या यह इस तरह से काम करने के लिए पूरी तरह से कानूनी है? – Jeroen
यह एक बुरा अभ्यास नहीं है, यह जावास्क्रिप्ट कैसे काम करता है, आपको केवल कॉलबैक के लिए उपयोग करने की आवश्यकता है .. वैसे भी, यह स्पष्ट रूप से सबसे साफ तरीका नहीं है, आप अपना स्वयं का फ़ंक्शन खरीद सकते हैं, कार्यक्षमता को लपेट सकते हैं, या कुछ ऐसा उपयोग कर सकते हैं: https : //github.com/coolaj86/futures/tree/v2.0/forEachAsync, जो फंक्शन कॉलबैक के आदेश की गारंटी देता है (जो कोड मैंने प्रदान किया है) – BFil
धन्यवाद, यह मेरे लिए पूरी तरह से काम करता है :) – thtsigma