कर्मचारी संदेश को कतारबद्ध करेगा (विशेष रूप से, यह onmessage
पर कॉल कतारबद्ध करेगा) और जब भी कार्यकर्ता का कॉल स्टैक खाली होता है तो प्रत्येक संदेश को संसाधित करता है।
इसका मतलब है कि, हालांकि, किसी भी विशेष ऑपरेशन को पूरा करने से पहले एसिंक्रोनस ऑपरेशन इनपुट एकाधिक संदेश संसाधित हो सकता है। उदाहरण के लिए:
onmessage = function(e) {
var xhr = new XMLHttpRequest();
xhr.open("GET", "/" + e.data);
xhr.onload = function() {
postMessage(xhr.responseText);
}
}
आप एक बार से कम 1000 संदेशों में पारित कर दिया है, मैं ब्राउज़र 1000 अजाक्स अनुरोध (या अनुरोध के कम से कम एक बहुत) बंद आग से पहले ही onload
के अंदर postMessage
चलाता है संदेह है। ऐसा इसलिए है क्योंकि onload
अजाक्स कॉल पूरा होने तक नहीं चलता है, और प्रत्येक onload
कॉल onmessage
पर लंबित कॉल के पीछे ईवेंट कतार में जोड़ा जाएगा, जिसे अजाक्स फ़ेच पूरा करने से पहले अनुरोध किया गया था।
आप यह सुनिश्चित करना है कि केवल एक Ajax अनुरोध एक समय में बाहर है चाहता था, तो आप वास्तव में एक आंतरिक कतार है कि केवल चले गए जब onload
बुलाया गया था को लागू कर सकते हैं:
var queue = [];
var busy = false;
onmessage = function(e) {
if(busy) {
queue.push(e);
}
else {
busy = true;
runAjax(e);
}
}
var runAjax = function(e) {
var xhr = new XMLHttpRequest();
xhr.open("GET", e.data);
xhr.onload = function() {
postMessage(xhr.responseText);
if(queue.length) {
// run the next queued item
runAjax(queue.shift());
} else {
busy = false;
}
}
}
इस मामले में, पहले संदेशों चला जाता है else
ब्लॉक में, जो busy = true
सेट करता है और अजाक्स फ़ेच चलाता है। निम्नलिखित 999 संदेशों को if
ब्लॉक पर भेजा गया है, क्योंकि busy
true
है (और false
नहीं बन जाएगा जब तक कि अजाक्स अनुरोध पूरा नहीं हुआ औरqueue
खाली है)। अजाक्स अनुरोध पूरा होने के बाद ही कतारबद्ध संदेश प्रबंधित किए जाते हैं।
आप समय में एक से अधिक Ajax अनुरोध को सहन करना चाहता था, तो आप एक काउंटर के बजाय बूलियन का इस्तेमाल कर सकते हैं: बजाय true
और false
, और परीक्षण की स्थापना के busy++
और busy--
का उपयोग करें कि बकाया कनेक्शन की वर्तमान संख्या तक नहीं पहुंची है आपकी अनुमति अधिकतम (यानी, if(busy == 5)
if(busy)
के बजाय)।