जावास्क्रिप्ट वेब की रीढ़ है, जो अरबों वेबसाइटों और अनुप्रयोगों के लिए गतिशील क्लाइंट-साइड कार्यक्षमता को शक्ति प्रदान करती है। लेकिन क्या आपने कभी सोचा है कि जावास्क्रिप्ट पृष्ठभूमि में अपना जादू कैसे काम करता है? इस पोस्ट में, हम जावास्क्रिप्ट की एकल-थ्रेडेड प्रकृति की आंतरिक कार्यप्रणाली में गहराई से उतरेंगे और एसिंक्रोनस प्रोग्रामिंग की अवधारणा का पता लगाएंगे।
जब हम कहते हैं कि जावास्क्रिप्ट "सिंगल-थ्रेडेड" है, तो इसका मतलब है कि इसमें सिंगल कॉल स्टैक है। कॉल स्टैक अनिवार्य रूप से वह संरचना है जहां जावास्क्रिप्ट निष्पादित किए जा रहे कार्यों का ट्रैक रखता है। यह लास्ट इन, फ़र्स्ट आउट (LIFO) क्रम का पालन करता है, जिसका अर्थ है कि स्टैक पर धकेला गया अंतिम फ़ंक्शन सबसे पहले समाप्त होगा। यह कैसे काम करता है इसका एक उदाहरण यहां दिया गया है:
function first() { console.log('First function'); } function second() { console.log('Second function'); } first(); second();
इस उदाहरण में, पहला() फ़ंक्शन स्टैक में जोड़ा जाता है और निष्पादित किया जाता है। एक बार यह पूरा हो जाने पर, इसे पॉप ऑफ कर दिया जाता है, और दूसरे() फ़ंक्शन को स्टैक पर धकेल दिया जाता है और आगे निष्पादित किया जाता है।
हालांकि एकल-थ्रेडेड भाषाएं सीमित लग सकती हैं क्योंकि वे एक समय में केवल एक ही काम कर सकती हैं, जावास्क्रिप्ट का अतुल्यकालिक तंत्र का चतुर उपयोग इसे मल्टीटास्किंग का अनुकरण करने की अनुमति देता है।
जावास्क्रिप्ट उन परिचालनों को संभालने के लिए अतुल्यकालिक निष्पादन का उपयोग करता है जिन्हें पूरा होने में लंबा समय लग सकता है, जैसे नेटवर्क अनुरोध, फ़ाइल I/O, या टाइमर। सिंगल-थ्रेडेड होने के बावजूद, यह इवेंट लूप और कॉलबैक कतार की बदौलत एक साथ कई कार्यों को प्रबंधित कर सकता है।
ईवेंट लूप जावास्क्रिप्ट के समवर्ती मॉडल में एक मुख्य अवधारणा है। इसकी प्राथमिक जिम्मेदारी यह प्रबंधित करना है कि जावास्क्रिप्ट अतुल्यकालिक कोड निष्पादन को कैसे संभालता है। यह ऐसे काम करता है:
सिंक्रोनस कोड पहले चलता है। जब जावास्क्रिप्ट प्रारंभ होता है, तो यह कॉल स्टैक का उपयोग करके, वैश्विक दायरे में सभी कोड को एक समकालिक तरीके से, लाइन दर लाइन निष्पादित करता है।
एसिंक्रोनस कार्य वेब एपीआई (जैसे सेटटाइमआउट, फ़ेच इत्यादि) या नोड.जेएस एपीआई पर भेजे जाते हैं, जहां उन्हें पृष्ठभूमि में संसाधित किया जाएगा।
कॉलबैक कतार वह जगह है जहां अतुल्यकालिक संचालन पूरा होने के बाद रखा जाता है।
इवेंट लूप लगातार जांच करता है कि कॉल स्टैक खाली है या नहीं। यदि स्टैक खाली है, तो यह कॉलबैक कतार से पहला आइटम लेता है और इसे कॉल स्टैक पर धकेलता है, जिससे इसे निष्पादित किया जा सकता है।
एसिंक्रोनस जावास्क्रिप्ट का जादू इवेंट लूप, कॉल स्टैक और कॉलबैक कतार के बीच इस इंटरैक्शन में निहित है। एसिंक्रोनस ऑपरेशंस कॉल स्टैक को ब्लॉक नहीं करते हैं, जिसका अर्थ है कि जावास्क्रिप्ट पृष्ठभूमि कार्यों के पूरा होने की प्रतीक्षा करते हुए अन्य कोड निष्पादित करना जारी रख सकता है।
सेटटाइमआउट फ़ंक्शन के साथ निम्नलिखित उदाहरण पर विचार करें:
console.log('Start'); setTimeout(() => { console.log('This runs after 2 seconds'); }, 2000); console.log('End');
यहां बताया गया है कि चरण दर चरण क्या होता है:
जावास्क्रिप्ट "स्टार्ट" प्रिंट करता है।
सेटटाइमआउट फ़ंक्शन को कॉल किया जाता है, लेकिन निष्पादन को 2 सेकंड के लिए अवरुद्ध करने के बजाय, इसे वेब एपीआई पर भेजा जाता है, जहां यह पृष्ठभूमि में चलता है।
जावास्क्रिप्ट सेटटाइमआउट के पूरा होने की प्रतीक्षा किए बिना अपना निष्पादन जारी रखते हुए "एंड" प्रिंट करता है।
2 सेकंड के बाद, सेटटाइमआउट के अंदर कॉलबैक फ़ंक्शन को कॉलबैक कतार में रखा जाता है।
इवेंट लूप जांच करता है कि कॉल स्टैक खाली है (जो कि यह है), फिर कॉलबैक फ़ंक्शन को स्टैक पर धकेलता है और इसे निष्पादित करता है, प्रिंट करता है "यह 2 सेकंड के बाद चलता है"।
आधुनिक जावास्क्रिप्ट में एसिंक्रोनस कार्यों को संभालने का एक और लोकप्रिय तरीका प्रॉमिस और एसिंक/वेट सिंटैक्स के माध्यम से है, जो गहराई से नेस्टेड कॉलबैक (जिसे "कॉलबैक हेल" भी कहा जाता है) से बचकर कोड को अधिक पठनीय बनाने में मदद करता है।
एक वादा एक अतुल्यकालिक ऑपरेशन के अंतिम समापन (या विफलता) और उसके परिणामी मूल्य का प्रतिनिधित्व करता है। यहाँ एक उदाहरण है:
const promise = new Promise((resolve, reject) => { setTimeout(() => { resolve('Promise resolved!'); }, 1000); }); promise.then(result => { console.log(result); // Output after 1 second: 'Promise resolved!' });
कॉलबैक पर भरोसा करने के बजाय, वादा पूरा होने पर क्या होता है, इसे संभालने के लिए हम तब() का उपयोग कर सकते हैं। यदि हम एसिंक्रोनस कोड को अधिक सिंक्रोनस-दिखने वाले तरीके से संभालना चाहते हैं, तो हम async/प्रतीक्षा का उपयोग कर सकते हैं:
async function asyncExample() { const result = await promise; console.log(result); // Output after 1 second: 'Promise resolved!' } asyncExample();
यह कोड को साफ-सुथरा और समझने में आसान बनाता है, जिससे हमें कोड की अगली पंक्ति पर जाने से पहले अतुल्यकालिक कार्यों को पूरा करने के लिए "प्रतीक्षा" करने की अनुमति मिलती है, भले ही जावास्क्रिप्ट हुड के नीचे गैर-अवरुद्ध रहता है।
कॉल स्टैक: जहां सिंक्रोनस कोड निष्पादित होता है।
वेब एपीआई/नोड.जेएस एपीआई: बाहरी वातावरण जहां अतुल्यकालिक कार्यों (जैसे नेटवर्क अनुरोध) को संभाला जाता है।
कॉलबैक कतार: एक कतार जहां अतुल्यकालिक कार्य परिणाम निष्पादन के लिए कॉल स्टैक पर भेजे जाने की प्रतीक्षा करते हैं।
इवेंट लूप: वह प्रणाली जो कॉल स्टैक और कॉलबैक कतार के बीच समन्वय करती है, यह सुनिश्चित करती है कि कार्यों को सही क्रम में प्रबंधित किया जाता है।
जावास्क्रिप्ट की एकल-थ्रेडेड प्रकृति पहली नज़र में सीमित लग सकती है, लेकिन इसकी अतुल्यकालिक क्षमताएं इसे कई कार्यों को कुशलतापूर्वक प्रबंधित करने की अनुमति देती हैं। इवेंट लूप, कॉलबैक क्यू और प्रॉमिस जैसे तंत्रों के माध्यम से, जावास्क्रिप्ट एक सहज, समकालिक-दिखने वाली कोडिंग शैली को बनाए रखते हुए जटिल, गैर-अवरुद्ध संचालन को संभालने में सक्षम है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3