सभी जावास्क्रिप्ट ईवेंट हैंडलर स्क्रिप्ट एक मास्टर घटना कतार से नियंत्रित किया जाता है। इसका मतलब यह है कि ईवेंट हैंडलर एक समय में एक चलाते हैं और एक आगे चलने के लिए तैयार होने से पहले पूरा होने तक चलता है। इस प्रकार, जावास्क्रिप्ट में सामान्य दौड़ की कोई भी स्थिति नहीं है कि कोई एक बहुप्रचारित भाषा में दिखाई देगा जहां भाषा के कई थ्रेड एक बार (या समय कटा हुआ) और चर के उपयोग के लिए संघर्ष चल रहे हैं। जावास्क्रिप्ट में निष्पादन का कोई भी व्यक्तिगत धागा अगले शुरू होने से पहले पूरा होने के लिए चला जाएगा। जावास्क्रिप्ट कैसे काम करता है। ईवेंट कतार से निकाला गया ईवेंट, उस ईवेंट को संभालने के लिए कोड चलना शुरू हो जाता है। वह कोड तब तक चलता है जब तक कि यह सिस्टम पर नियंत्रण नहीं लौटाता है, जहां सिस्टम इवेंट कतार से अगला ईवेंट खींच लेगा और उस कोड को तब तक चलाएगा जब तक कि यह सिस्टम पर वापस नियंत्रण न करे।
इस प्रकार सामान्य दौड़ की स्थिति जो निष्पादन के दो धागे के कारण होती है, उसी समय जावास्क्रिप्ट में नहीं होती है।
यह सब सहित जावास्क्रिप्ट घटनाओं के रूपों में शामिल हैं: (आदि .. माउस, चाबियाँ,) आदि उपयोगकर्ता घटनाओं, टाइमर घटनाओं, नेटवर्क घटनाओं (ajax कॉलबैक), ...
केवल जगह आप वास्तव में क्या कर सकते हैं जावास्क्रिप्ट में बहु-थ्रेडिंग HTML5 Web Workers के साथ है, लेकिन वे नियमित जावास्क्रिप्ट से बहुत अलग हैं (वे केवल संदेश पासिंग के माध्यम से नियमित जावास्क्रिप्ट के साथ संवाद कर सकते हैं) और डीओएम में हस्तक्षेप नहीं कर सकते हैं और उनकी अपनी स्क्रिप्ट और नेमस्पेस आदि होनी चाहिए ...
जबकि मैं तकनीकी रूप से इसे दौड़ की स्थिति नहीं कहूंगा, वहां स्थिति होगी जावास्क्रिप्ट में आयनों में से कुछ एसिंक्रोनस ऑपरेशंस के कारण जहां आप दो या दो से अधिक असिंक्रोनस ऑपरेशंस चल सकते हैं और यह तब तक अप्रत्याशित हो सकता है जब प्रत्येक ऑपरेशन दूसरों के सापेक्ष पूरा हो जाए।यह समय की अनिश्चितता पैदा करता है (यदि आपके कोड के लिए संचालन का सापेक्ष समय महत्वपूर्ण है) तो कुछ ऐसा बनाता है जिसके लिए आपको मैन्युअल रूप से कोड करना है। आपको परिचालनों को अनुक्रमित करने की आवश्यकता हो सकती है ताकि एक रन चल सके और आप सचमुच अगले को शुरू करने से पहले इसे पूरा करने के लिए प्रतीक्षा कर सकते हैं। या, आप सभी तीन परिचालन शुरू कर सकते हैं और उसके बाद कुछ कोड हैं जो सभी तीन परिणामों को एकत्र करते हैं और जब वे सभी तैयार होते हैं, तो आपका कोड बढ़ जाता है।
आधुनिक जावास्क्रिप्ट में, आमतौर पर इन प्रकार के एसिंक्रोनस ऑपरेशंस को प्रबंधित करने के लिए वादे का उपयोग किया जाता है।
तो, अगर आपको लगता है कि प्रत्येक एक वादा वापसी (आदि किसी डेटाबेस से पढ़ने, किसी अन्य सर्वर से एक अनुरोध प्राप्त करते समय, ...) की तरह तीन अतुल्यकालिक संचालन किया था, तो आप मैन्युअल तो इस तरह क्रम सकता है:
a().then(b).then(c).then(result => {
// result here
}).catch(err => {
// error here
});
या, यदि आप उन सब (सभी उड़ान में एक ही समय में) एक साथ चलाने के लिए और बस जब वे सब कर रहे थे पता था, तुम कर सकते हो:
Promise.all([a(), b(), c()])..then(results => {
// results here
}).catch(err => {
// error here
});
जब मैं इन दौड़ की स्थिति फोन नहीं होगा, वे इंडे को नियंत्रित करने के लिए आपके कोड को डिजाइन करने के समान परिवार में हैं अनुक्रमण अनुक्रमित करें।
ब्राउज़र में कुछ स्थितियों में एक विशेष मामला हो सकता है। यह वास्तव में दौड़ की स्थिति नहीं है, लेकिन यदि आप अस्थायी स्थिति के साथ बहुत से वैश्विक चर का उपयोग कर रहे हैं, तो यह कुछ पता होना चाहिए। जब आपका स्वयं का कोड किसी अन्य घटना का कारण बनता है, तो ब्राउज़र कभी-कभी निष्पादन के वर्तमान धागे तक प्रतीक्षा करने के बजाय उस ईवेंट हैंडलर को सिंक्रनाइज़ रूप से कॉल करेगा। इस का एक उदाहरण है:
- क्लिक
- क्लिक ईवेंट हैंडलर परिवर्तन एक और फ़ील्ड पर ध्यान अन्य क्षेत्र onFocus के लिए एक ईवेंट हैंडलर है
- कि
- ब्राउज़र कॉल onFocus ईवेंट हैंडलर तुरंत
- ऑनफोकस इवेंट हैंडलर
- शेष क्लिक इवेंट हैंडलर चलाता है (। फोकस() कॉल के बाद)
यह तकनीकी रूप से दौड़ की स्थिति नहीं है क्योंकि यह 100% ज्ञात है जब ऑनफोकस ईवेंट हैंडलर निष्पादित करेगा (.focus()
कॉल के दौरान)। लेकिन, यह एक ऐसी स्थिति पैदा कर सकता है जहां एक इवेंट हैंडलर चलता है जबकि दूसरा निष्पादन के बीच में होता है।
क्यों फ्लैश कॉल जावास्क्रिप्ट फ़ंक्शन नहीं है? – zellio