एजेएक्स अनुरोध किए जाने के बाद, जावास्क्रिप्ट एक ही धागे में चलता है, पृष्ठभूमि में वास्तव में क्या होता है? मैं इस बारे में गहन जानकारी प्राप्त करना चाहूंगा कि क्या कोई प्रकाश डाल सकता है?
एजेएक्स अनुरोध किए जाने के बाद, जावास्क्रिप्ट एक ही धागे में चलता है, पृष्ठभूमि में वास्तव में क्या होता है? मैं इस बारे में गहन जानकारी प्राप्त करना चाहूंगा कि क्या कोई प्रकाश डाल सकता है?
जवाबों:
कवर के नीचे, जावास्क्रिप्ट की एक घटना कतार है। हर बार जब निष्पादन की एक जावास्क्रिप्ट धागा खत्म होता है, तो यह देखने के लिए जांचता है कि क्या कतार में एक और घटना है प्रक्रिया करने के लिए। अगर वहाँ है, तो यह कतार से खींचता है और उस घटना को ट्रिगर करता है (जैसे माउस क्लिक, उदाहरण के लिए)।
Ajax कॉल के अंतर्गत आने वाले मूल कोड नेटवर्किंग को पता होगा कि ajax प्रतिक्रिया कब होती है और एक घटना जावास्क्रिप्ट इवेंट कतार में जुड़ जाएगी। देशी कोड कैसे पता चलता है जब अजाक्स कॉल किया जाता है, कार्यान्वयन पर निर्भर करता है। इसे थ्रेड्स के साथ लागू किया जा सकता है या यह खुद से संचालित होने वाली घटना भी हो सकती है (यह वास्तव में कोई फर्क नहीं पड़ता)। कार्यान्वयन की बात यह है कि जब अजाक्स प्रतिक्रिया की जाती है, तो कुछ देशी कोड को यह पता चलेगा कि एक घटना को जेएस कतार में डाल दिया गया है।
यदि कोई जावास्क्रिप्ट समय पर नहीं चल रही है, तो घटना तुरंत चालू हो जाएगी जो कि अजाक्स प्रतिक्रिया हैंडलर चलाएगा। यदि समय पर कुछ चल रहा है, तो घटना को संसाधित किया जाएगा जब निष्पादन की वर्तमान जावास्क्रिप्ट धागा खत्म हो जाएगा। जावास्क्रिप्ट इंजन द्वारा किसी भी मतदान की आवश्यकता नहीं है। जब जावास्क्रिप्ट का एक टुकड़ा समाप्त हो जाता है, तो जेएस इंजन सिर्फ घटना कतार की जांच करता है कि क्या कुछ और है जिसे चलाने की आवश्यकता है। यदि ऐसा है, तो यह कतार से अगली घटना को पॉप करता है और इसे निष्पादित करता है (उस घटना के लिए पंजीकृत एक या अधिक कॉलबैक फ़ंक्शन को कॉल करता है)। यदि घटना की कतार में कुछ भी नहीं है, तो जेएस दुभाषिया के पास खाली समय (कचरा संग्रह या बेकार) है जब तक कि कुछ बाहरी एजेंट घटना कतार में कुछ और नहीं डालता है और इसे फिर से जगाता है।
चूँकि सभी बाहरी ईवेंट ईवेंट कतार से गुजरते हैं और कोई भी घटना कभी ट्रिगर नहीं होती है जबकि जावास्क्रिप्ट वास्तव में कुछ और चल रहा होता है, यह सिंगल थ्रेडेड रहता है।
यहाँ विवरण पर कुछ लेख हैं:
.focus()
एक आइटम पर कॉल करते हैं और जो कुछ अन्य घटनाओं को ट्रिगर करता है जैसे कि फोकस के साथ आइटम पर "धब्बा" घटना। वह धब्बा घटना समकालिक रूप से घटित होती है और घटना कतार से नहीं गुजरती है, इसलिए यह अन्य चीजों से ठीक पहले होगी जो कि घटना कतार में हो सकती है। व्यवहार में, मैंने इसे कभी भी व्यावहारिक चिंता नहीं माना है।
आप यहाँ जावास्क्रिप्ट में हैंडलिंग घटनाओं पर एक बहुत ही पूर्ण प्रलेखन पा सकते हैं ।
यह ओपेरा ब्राउज़र में जावास्क्रिप्ट कार्यान्वयन पर काम करने वाले एक व्यक्ति द्वारा लिखा गया है।
अधिक सटीक रूप से, शीर्षक देखें: "इवेंट फ़्लो", "इवेंट क्विज़िंग" और "नॉन-यूज़र इवेंट्स": आप सीखेंगे कि:
नोट: मूल लिंक था: लिंक , लेकिन अब मर चुका है।
मैं जवाबों में उल्लिखित अजाक्स कार्यान्वयन के बारे में थोड़ा विस्तार करना चाहता हूं।
हालांकि (नियमित) Javascript क्रियान्वयन है नहीं -थ्रेडेड बहु - जैसा कि ऊपर जवाब में अच्छी तरह से उल्लेख किया - हालांकि , के वास्तविक हैंडलिंग AJAX responses
(और साथ ही अनुरोध हैंडलिंग) है नहीं जावास्क्रिप्ट, और यह - आम तौर पर - है मल्टी-थ्रेडेड। ( XMLHttpRequest का क्रोमियम स्रोत कार्यान्वयन देखें जो हम ऊपर डिस्कस करेंगे)
और मैं समझाता हूँ, चलो निम्नलिखित कोड लेते हैं:
var xhr = new XMLHttpRequest();
var t = Date.now;
xhr.open( "GET", "https://swx.cdn.skype.com/shared/v/1.2.15/SkypeBootstrap.min.js?v="+t(), true );
xhr.onload = function( e ) {
console.log(t() + ': step 3');
alert(this.response.substr(0,20));
};
console.log(t() + ': step 1');
xhr.send();
console.log(t() + ': step 2');
after an AJAX request is made
(- चरण 1 के बाद), फिर जब आपका जेएस कोड निष्पादित हो जाता है (चरण 2 और उसके बाद), ब्राउज़र असली काम शुरू करता है: 1. एक टीसीपी अनुरोध को प्रारूपित करना 2. एक सॉकेट खोलना 3. हेडर भेजना 4. भेजना 5. भेजना शरीर 6. प्रतीक्षा प्रतिक्रिया 7. पढ़ने वाले हेडर 8. रीडिंग बॉडी आदि। यह सभी कार्यान्वयन आमतौर पर आपके js कोड निष्पादन के समानांतर एक अलग थ्रेड में चलाया जाता है। एक उदाहरण के लिए, क्रोमियम कार्यान्वयन का उल्लेख है थ्रेडेबल लोडर गो डिग-इन Thread का उपयोग करता है , (आप एक पेज लोड के नेटवर्क टैब को देखकर भी कुछ छाप प्राप्त कर सकते हैं, आप कुछ एक साथ अनुरोध देखेंगे)।
निष्कर्ष में, मैं कहूंगा कि - कम से कम - आपके अधिकांश I / O संचालन एक साथ / async किए जा सकते हैं (और आप उदाहरण के लिए एक प्रतीक्षा का उपयोग करके इसका लाभ उठा सकते हैं )। लेकिन उन कार्यों के साथ सभी इंटरैक्शन (जारी करने वाले, जेएस कॉलबैक निष्पादन) सभी तुल्यकालिक हैं।