जावास्क्रिप्ट पृष्ठभूमि में AJAX प्रतिक्रियाओं को कैसे संभालती है?


139

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


6
एक बहुत अच्छा विवरण यहाँ है: stackoverflow.com/questions/2914161/ajax-multi-threaded
जोनाथन एम।

3
जावास्क्रिप्ट कोड सिंगल थ्रेडेड है (वेब ​​वर्कर्स को छोड़कर), लेकिन जावास्क्रिप्ट इंजन को चलाने वाला ब्राउज़र नहीं ...
जुआन मेंडेस

@JuanMendes क्या एक धागे में जावास्क्रिप्ट चलता है जबकि इवेंट क्यू दूसरे धागे में चलता है?
शॉन लुटिन

1
@ShaunLuttin नहीं, इस घटना की कतार जावास्क्रिप्ट से दूर है
जुआन मेंडेस

जवाबों:


213

कवर के नीचे, जावास्क्रिप्ट की एक घटना कतार है। हर बार जब निष्पादन की एक जावास्क्रिप्ट धागा खत्म होता है, तो यह देखने के लिए जांचता है कि क्या कतार में एक और घटना है प्रक्रिया करने के लिए। अगर वहाँ है, तो यह कतार से खींचता है और उस घटना को ट्रिगर करता है (जैसे माउस क्लिक, उदाहरण के लिए)।

Ajax कॉल के अंतर्गत आने वाले मूल कोड नेटवर्किंग को पता होगा कि ajax प्रतिक्रिया कब होती है और एक घटना जावास्क्रिप्ट इवेंट कतार में जुड़ जाएगी। देशी कोड कैसे पता चलता है जब अजाक्स कॉल किया जाता है, कार्यान्वयन पर निर्भर करता है। इसे थ्रेड्स के साथ लागू किया जा सकता है या यह खुद से संचालित होने वाली घटना भी हो सकती है (यह वास्तव में कोई फर्क नहीं पड़ता)। कार्यान्वयन की बात यह है कि जब अजाक्स प्रतिक्रिया की जाती है, तो कुछ देशी कोड को यह पता चलेगा कि एक घटना को जेएस कतार में डाल दिया गया है।

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

चूँकि सभी बाहरी ईवेंट ईवेंट कतार से गुजरते हैं और कोई भी घटना कभी ट्रिगर नहीं होती है जबकि जावास्क्रिप्ट वास्तव में कुछ और चल रहा होता है, यह सिंगल थ्रेडेड रहता है।

यहाँ विवरण पर कुछ लेख हैं:


उसके लिए धन्यवाद। मुझे संदेह था कि यह मामला था, लेकिन निश्चित रूप से जानने के लिए अच्छा है। मेरे पास एक लूप है, जिसमें मैं बहुत सारे 'अजाक्स' अनुरोध भेजता हूं। मेरे हैंडलर में (प्रत्येक अनुरोध के लिए - अनियंत्रित क्रम में लौटा) मैं कुछ कोड चलाता हूं जिसमें कुछ समय लग सकता है। यह जानने के लिए अच्छा है कि यह निश्चित रूप से काम करना चाहिए।
iPadDeveloper2011

4
@ टैलेंडर - इवेंट्स को फीफो ऑर्डर में चलाया जाता है (यह संभव है कि कुछ एज-केस अपवाद हों, लेकिन इरादा फीफो है)। कुछ घटनाओं को थोड़ा अलग तरीके से व्यवहार किया जाता है। उदाहरण के लिए मूसमोव इवेंट्स कतार में ढेर नहीं करते हैं (शायद इसलिए कि वे आसानी से कतार से बाहर निकल सकते हैं)। जब माउस चलता है और एक मूसमव इवेंट पहले से ही कतार में होता है और कतार में कोई अन्य नई घटना नहीं होती है, तो इसे एक नई घटना के बजाय नवीनतम स्थिति के साथ अपडेट किया जाता है। मुझे लगता है कि अंतराल टाइमर घटनाओं को शायद कतार में जमा होने से बचने के लिए विशेष रूप से इलाज किया जाता है।
jfriend00

2
@ टटलैंडर - आपको आगे क्या समझाया जाना चाहिए? यह फीफो है। मैंने अपने उत्तर में कुछ और संदर्भ लेख जोड़े। केवल FIFO के बारे में मुझे पता है कि फाँसी की घटनाएँ तुरंत शुरू हो जाती हैं। आप .focus()एक आइटम पर कॉल करते हैं और जो कुछ अन्य घटनाओं को ट्रिगर करता है जैसे कि फोकस के साथ आइटम पर "धब्बा" घटना। वह धब्बा घटना समकालिक रूप से घटित होती है और घटना कतार से नहीं गुजरती है, इसलिए यह अन्य चीजों से ठीक पहले होगी जो कि घटना कतार में हो सकती है। व्यवहार में, मैंने इसे कभी भी व्यावहारिक चिंता नहीं माना है।
jfriend00

2
@telandor - प्रति ब्राउज़र दस्तावेज़ में कई कतारें नहीं हैं। एक कतार है और सब कुछ क्रमिक रूप से FIFO में / बाहर हो जाता है। इसलिए टाइमआउट और अजाक्स प्रतिक्रियाएं और माउस इवेंट और कीबोर्ड इवेंट सभी एक ही कतार में चलते हैं। जिस किसी को भी कतार में लगाया जाता है वह पहले भाग जाता है।
21

1
@CleanCrispCode - Thx। मैंने इसे अपने उत्तर के लिए एक उपयोगी संदर्भ के रूप में जोड़ा।
jfriend00

16

आप यहाँ जावास्क्रिप्ट में हैंडलिंग घटनाओं पर एक बहुत ही पूर्ण प्रलेखन पा सकते हैं ।
यह ओपेरा ब्राउज़र में जावास्क्रिप्ट कार्यान्वयन पर काम करने वाले एक व्यक्ति द्वारा लिखा गया है।

अधिक सटीक रूप से, शीर्षक देखें: "इवेंट फ़्लो", "इवेंट क्विज़िंग" और "नॉन-यूज़र इवेंट्स": आप सीखेंगे कि:

  1. जावास्क्रिप्ट प्रत्येक ब्राउज़र टैब या विंडो के लिए एक ही धागे में चलता है।
  2. घटनाओं को कतारबद्ध और क्रमिक रूप से निष्पादित किया जाता है।
  3. XMLHttpRequest को कार्यान्वयन द्वारा चलाया जाता है और कॉलबैक ईवेंट कतार का उपयोग करके चलाया जाता है।

नोट: मूल लिंक था: लिंक , लेकिन अब मर चुका है।


1

मैं जवाबों में उल्लिखित अजाक्स कार्यान्वयन के बारे में थोड़ा विस्तार करना चाहता हूं।

हालांकि (नियमित) 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 किए जा सकते हैं (और आप उदाहरण के लिए एक प्रतीक्षा का उपयोग करके इसका लाभ उठा सकते हैं )। लेकिन उन कार्यों के साथ सभी इंटरैक्शन (जारी करने वाले, जेएस कॉलबैक निष्पादन) सभी तुल्यकालिक हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.