2011-10-23 14 views
13

मैं अभी भी जावास्क्रिप्ट के लिए नया हूं। मैं एक साधारण पृष्ठ विकसित कर रहा हूं जहां मैं एक सर्वलेट पर एक मूल्य लाने वाला बटन क्लिक करता हूं और इसे प्रदर्शित करता हूं। यह अच्छी तरह से काम करता है, जब तक कि मैं बटन पर पागल की तरह क्लिक नहीं करता। कभी-कभी, प्रदर्शित परिणाम शून्य है।जावास्क्रिप्ट विधियों को थ्रेड-सुरक्षित या सिंक्रनाइज़ करने के लिए कॉल कर रहे हैं?

मैं सोच रहा हूँ कि यह वही निम्नलिखित कार्य करने के लिए एक साथ कॉल के कारण होता है या नहीं:

function loadXMLDoc2(retr) { 
    var xmlhttp; 
    if (window.XMLHttpRequest) { 
     // code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
    } 
    xmlhttp.onreadystatechange=function() { 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) { 
      $("#" + retr).button('option', 'label', xmlhttp.responseText); 
      // document.getElementById(retr).innerHTML=xmlhttp.responseText; 
     } 
    } 
    var param = "cmd=" + encodeURIComponent(retr); 
    document.getElementById("TOP_LEFT").innerHTML = param; 
    xmlhttp.open("GET","/WebFront/Asynclet?" + param,true); 
    xmlhttp.send(null); 
} 

जावास्क्रिप्ट धागा सुरक्षित है? और यदि नहीं, तो मैं इस विधि में कॉल को सिंक्रनाइज़ या अलग कैसे कर सकता हूं?

+0

मुझे लगता है कि अधिकतर ब्राउज़र दौड़ की स्थिति को रोकने की कोशिश करते हैं। मुझे जावास्क्रिप्ट में कोई सिंक्रनाइज़ेशन ब्लॉक या ऐसा नहीं देखा गया क्योंकि यह आसान (और एकल-थ्रेडेड) के लिए डिज़ाइन किया गया है। –

उत्तर

31

एचटीएमएल 5 वेब श्रमिकों (जो बहुत कड़े नियंत्रित हैं) के अलावा, जावास्क्रिप्ट एकल थ्रेडेड है इसलिए थ्रेड सुरक्षा के साथ कोई समस्या नहीं है। अगले एक शुरू होने से पहले निष्पादन का एक धागा खत्म हो जाएगा।

AJAX प्रतिक्रियाओं जैसी चीजें एक ईवेंट कतार के माध्यम से जाती हैं और निष्पादन के किसी अन्य धागे को समाप्त होने पर ही निष्पादित किया जाता है।

अधिक जानकारी के लिए Do I need to be concerned with race conditions with asynchronous Javascript? देखें।

AJAX प्रतिक्रिया कॉलबैक की एक विशिष्ट चर्चा के लिए How does JavaScript handle AJAX responses in the background? देखें।

4

ब्राउज़र के संदर्भ में, जावास्क्रिप्ट अनिवार्य रूप से सिंगल-थ्रेडेड है। (कुछ नई ब्राउज़र विशेषताएं हैं जो एक प्रकार का थ्रेडिंग मॉडल प्रदान करती हैं, लेकिन थ्रेड इंटरैक्शन बहुत सीमित हैं और डेटा को सीधे साझा नहीं किया जा सकता है।)