परिभाषा
शब्द "एसिंक्रोनस" का उपयोग थोड़े अलग अर्थों में किया जा सकता है, जिसके परिणामस्वरूप प्रतीत होता है कि परस्पर विरोधी उत्तर यहां हैं, जबकि वे वास्तव में नहीं हैं। एसिंक्रोनसी पर विकिपीडिया की यह परिभाषा है:
अतुल्यकालिक, कंप्यूटर प्रोग्रामिंग में, मुख्य कार्यक्रम के प्रवाह से स्वतंत्र घटनाओं और ऐसी घटनाओं से निपटने के तरीकों की घटना को संदर्भित करता है। ये "बाहरी" घटनाएं हो सकती हैं जैसे कि संकेतों के आगमन, या कार्यक्रम द्वारा उकसाए गए कार्यक्रम जो कार्यक्रम के निष्पादन के साथ समवर्ती रूप से होते हैं, कार्यक्रम के परिणामों के लिए प्रतीक्षा करने के लिए अवरुद्ध किए बिना।
गैर-जावास्क्रिप्ट कोड जावास्क्रिप्ट के कुछ घटनाओं की कतार के लिए इस तरह के "बाहर" घटनाओं को कतारबद्ध कर सकता है। लेकिन यह जहाँ तक जाता है।
कोई पूर्वधारणा नहीं
आपकी स्क्रिप्ट में कुछ अन्य जावास्क्रिप्ट कोड निष्पादित करने के लिए जावास्क्रिप्ट कोड चलाने का कोई बाहरी व्यवधान नहीं है । जावास्क्रिप्ट के टुकड़ों को एक के बाद एक निष्पादित किया जाता है, और आदेश प्रत्येक घटना कतार में घटनाओं के क्रम और उन कतारों की प्राथमिकता से निर्धारित होता है।
उदाहरण के लिए, आप पूरी तरह से सुनिश्चित हो सकते हैं कि कोई भी जावास्क्रिप्ट (उसी स्क्रिप्ट में) कभी भी निष्पादित नहीं होगा, जबकि निम्नलिखित कोड कोड निष्पादित होता है:
let a = [1, 4, 15, 7, 2];
let sum = 0;
for (let i = 0; i < a.length; i++) {
sum += a[i];
}
दूसरे शब्दों में, जावास्क्रिप्ट में कोई पूर्व सूचना नहीं है । जो कुछ भी घटना कतारों में हो सकता है, उन घटनाओं के प्रसंस्करण को तब तक इंतजार करना होगा जब तक कि इस तरह का कोड पूरा नहीं हो जाता। EcmaScript विनिर्देश धारा 8.4 नौकरियों और नौकरियों कतार में कहते हैं :
किसी कार्य का निष्पादन केवल तभी शुरू किया जा सकता है जब कोई निष्पादन निष्पादन संदर्भ न हो और निष्पादन संदर्भ स्टैक खाली हो।
अतुल्यकालिक के उदाहरण
जैसा कि अन्य लोग पहले ही लिख चुके हैं, ऐसी कई स्थितियाँ हैं जहाँ जावास्क्रिप्ट में अतुल्यकालिक खेल आता है, और इसमें हमेशा एक घटना कतार शामिल होती है, जिसके परिणामस्वरूप केवल जावास्क्रिप्ट निष्पादन हो सकता है जब कोई अन्य जावास्क्रिप्ट कोड निष्पादित नहीं होता है:
setTimeout()
: समय समाप्त हो जाने पर एजेंट (जैसे ब्राउज़र) ईवेंट कतार में एक घटना डाल देगा। समय की निगरानी और घटना को कतार में रखना गैर-जावास्क्रिप्ट कोड द्वारा होता है, और इसलिए आप कल्पना कर सकते हैं कि यह कुछ जावास्क्रिप्ट कोड के संभावित निष्पादन के समानांतर होता है। लेकिन कॉलबैक प्रदान करने के लिए setTimeout
केवल तभी क्रियान्वित किया जा सकता है जब वर्तमान में जावास्क्रिप्ट कोड निष्पादित हो रहा है और पूरा हो गया है और उपयुक्त ईवेंट कतार पढ़ी जा रही है।
fetch()
: एजेंट एक HTTP अनुरोध करने और किसी भी आने वाली प्रतिक्रिया के लिए निगरानी करने के लिए OS फ़ंक्शन का उपयोग करेगा। फिर, यह गैर-जावास्क्रिप्ट कार्य कुछ जावास्क्रिप्ट कोड के समानांतर चल सकता है जो अभी भी निष्पादित हो रहा है। लेकिन वादा समाधान प्रक्रिया, जो कि लौटाए गए वादे को हल करेगी fetch()
, केवल तभी निष्पादित हो सकती है जब वर्तमान में निष्पादित जावास्क्रिप्ट पूरा होने के लिए दौड़ा हो।
requestAnimationFrame()
: ब्राउज़र का रेंडरिंग इंजन (नॉन-जावास्क्रिप्ट) एक घटना को जावास्क्रिप्ट कतार में रखेगा जब वह पेंट ऑपरेशन करने के लिए तैयार होगा। जब जावास्क्रिप्ट ईवेंट संसाधित होता है तो कॉलबैक फ़ंक्शन निष्पादित होता है।
queueMicrotask()
: तुरंत एक घटना को माइक्रोटस्क कतार में रखता है। कॉल स्टैक खाली होने पर कॉलबैक निष्पादित किया जाएगा और उस ईवेंट का उपभोग किया जाएगा।
कई और उदाहरण हैं, लेकिन ये सभी कार्य मेजबान पर्यावरण द्वारा प्रदान किए जाते हैं, कोर एक्मास्क्रिप्ट द्वारा नहीं। कोर एक्मास्क्रिप्ट के साथ आप एक घटना को एक वादा नौकरी की कतार में रख सकते हैं Promise.resolve()
।
भाषा का निर्माण
ECMAScript जैसे asynchrony पैटर्न का समर्थन करने के कई भाषा निर्माणों, प्रदान करता है yield
, async
, await
। लेकिन कोई गलती न होने दें: कोई जावास्क्रिप्ट कोड किसी बाहरी घटना से बाधित नहीं होगा । "रुकावट" कि yield
और await
प्रदान करने के लिए लग रहे हैं, बस एक नियंत्रित, एक समारोह कॉल से लौटने और बाद में इसके निष्पादन संदर्भ बहाल करने की पूर्वनिर्धारित तरीका है या तो जे एस कोड (के मामले में yield
), या घटना कतार (के मामले में await
)।
डोम इवेंट हैंडलिंग
जब जावास्क्रिप्ट कोड DOM API को एक्सेस करता है, तो यह कुछ मामलों में DOM API को एक या अधिक सिंक्रोनस नोटिफ़िकेशन को ट्रिगर कर सकता है। और अगर आपके कोड में कोई इवेंट हैंडलर है जो उसे सुन रहा है, तो उसे कॉल किया जाएगा।
यह पूर्व-खाली कंसीडर के रूप में सामने आ सकता है, लेकिन ऐसा नहीं है: एक बार जब आपका ईवेंट हैंडलर (रिटर्न) वापस आ जाता है, तो DOM API भी अंततः वापस आ जाएगा, और मूल जावास्क्रिप्ट कोड जारी रहेगा।
अन्य मामलों में DOM API केवल किसी ईवेंट को उचित ईवेंट कतार में भेज देगा, और कॉल स्टैक खाली करने के बाद JavaScript इसे उठा लेगी।
सिंक्रोनस और एसिंक्रोनस इवेंट देखें