जब डेवलपर्स पहली बार जावास्क्रिप्ट में सेटटाइमआउट का सामना करते हैं, तो यह अक्सर फ़ंक्शन निष्पादन में देरी के लिए एक सीधा उपकरण जैसा लगता है। हालाँकि, यह समझना कि सेटटाइमआउट जावास्क्रिप्ट रनटाइम और इवेंट लूप के साथ कैसे इंटरैक्ट करता है, कुछ अप्रत्याशित व्यवहार को प्रकट कर सकता है, खासकर कुछ स्थितियों में। और यह सिर्फ सेटटाइमआउट नहीं है; इसी तरह की जटिलताएँ सेटइंटरवल और अन्य अतुल्यकालिक कार्यों के साथ भी उत्पन्न होती हैं।
इवेंट लूप: एक संक्षिप्त अवलोकन
जावास्क्रिप्ट सिंगल-थ्रेडेड है, जिसका अर्थ है कि यह एक समय में कोड के केवल एक टुकड़े को निष्पादित कर सकता है। इसके बावजूद, इवेंट लूप जावास्क्रिप्ट को गैर-अवरुद्ध संचालन करने की अनुमति देता है। यह टाइमर, नेटवर्क अनुरोध, या I/O संचालन जैसे कार्यों को ब्राउज़र या Node.js API पर लोड करके इसे प्राप्त करता है। एक बार जब ये कार्य पूरे हो जाते हैं, तो उनके कॉलबैक फ़ंक्शन निष्पादन के लिए इवेंट लूप में फिर से कतारबद्ध हो जाते हैं।
सेटटाइमआउट कैसे काम करता है
जब आप सेटटाइमआउट को कॉल करते हैं, तो आप जावास्क्रिप्ट इंजन को एक निर्दिष्ट अवधि के बाद एक फ़ंक्शन निष्पादित करने के लिए कहते हैं। यह कॉलबैक फ़ंक्शन को इवेंट लूप की कतार में जोड़कर किया जाता है। हालाँकि, निर्दिष्ट विलंब वह न्यूनतम समय है जो इंजन को कॉलबैक को कतार में जोड़ने से पहले इंतजार करना चाहिए, गारंटीकृत निष्पादन समय नहीं। यहां विस्तार से बताया गया है कि यह कैसे काम करता है:
प्रारंभिक कॉल: जब सेटटाइमआउट को कॉलबैक फ़ंक्शन और देरी के साथ लागू किया जाता है, तो जावास्क्रिप्ट इंजन इसे ब्राउज़र या नोड.जेएस द्वारा प्रदान किए गए वेब एपीआई वातावरण में पंजीकृत करता है।
टाइमर: वेब एपीआई निर्दिष्ट विलंब के लिए एक टाइमर शुरू करता है। इस अवधि के दौरान, मुख्य कॉल स्टैक किसी भी सिंक्रोनस कोड को निष्पादित करना जारी रखता है जो सेटटाइमआउट कॉल का अनुसरण करता है।
कॉलबैक कतार: एक बार टाइमर समाप्त हो जाने पर, वेब एपीआई तुरंत कॉलबैक निष्पादित नहीं करता है। इसके बजाय, यह कॉलबैक फ़ंक्शन को इवेंट कतार में ले जाता है।
इवेंट लूप: इवेंट लूप, जो लगातार कॉल स्टैक और इवेंट कतार पर नज़र रखता है, चलन में आता है। यदि कॉल स्टैक खाली है, जिसका अर्थ है कि वर्तमान में कोई निष्पादित कार्य नहीं है, तो इवेंट लूप इवेंट कतार से पहला फ़ंक्शन लेता है और इसे निष्पादन के लिए कॉल स्टैक पर धकेलता है।
निष्पादन: कॉलबैक फ़ंक्शन अंततः तब निष्पादित होता है जब यह कॉल स्टैक के शीर्ष पर पहुंच जाता है।
यह ध्यान रखना महत्वपूर्ण है कि यदि टाइमर समाप्त होने पर कॉल स्टैक अन्य कार्यों में व्यस्त है, तो कॉलबैक फ़ंक्शन निष्पादित होने से पहले अतिरिक्त देरी हो सकती है। ऐसा इसलिए है क्योंकि इवेंट लूप को इवेंट कतार से कॉलबैक फ़ंक्शन को संसाधित करने से पहले कॉल स्टैक साफ़ होने तक प्रतीक्षा करनी होगी।
ब्लॉकिंग मुद्दा
एक आम ग़लतफ़हमी यह मान रही है कि सेटटाइमआउट हमेशा निर्दिष्ट सटीक देरी के बाद कॉलबैक निष्पादित करेगा। यदि ईवेंट लूप सिंक्रोनस कोड द्वारा अवरुद्ध है, जैसे अनंत लूप या लंबे समय तक चलने वाली गणना, तो कॉलबैक तब तक निष्पादित नहीं किया जाएगा जब तक कि ईवेंट लूप मुक्त न हो जाए।
निम्नलिखित परिदृश्य पर विचार करें:
console.log('Program started at: ' new Date().toLocaleTimeString()); const programStartTime = Date.now(); function blockExecutionForThirtySeconds() { while (true) { const currentTime = Date.now(); if (currentTime - programStartTime > 30000) { console.log('Blocking execution completed after 30 seconds...'); return true; } } } console.log('Setting setTimeout for 1 second.'); setTimeout(() => { console.log('setTimeout executed after 30 seconds instead of 1 second: ' new Date().toLocaleTimeString()); }, 1000); blockExecutionForThirtySeconds();
इस उदाहरण में, ब्लॉकएक्सेक्यूशनफॉरथर्टीसेकंड फ़ंक्शन इवेंट लूप को एक अनंत लूप के साथ ब्लॉक करता है जो 30 सेकंड तक चलता है। भले ही setTimeout को 1 सेकंड के बाद निष्पादित करने के लिए सेट किया गया है, यह केवल ब्लॉकएक्सेक्यूशनफॉरथर्टीसेकंड के पूरा होने के बाद ही चलेगा, जो कि 30 सेकंड के बाद है।
वास्तविक दुनिया के निहितार्थ
इस व्यवहार को समझना डेवलपर्स के लिए महत्वपूर्ण है, खासकर जब टाइमआउट, अंतराल या एसिंक्रोनस प्रोसेसिंग वाले कोड लिखते हैं। सेटटाइमआउट कैसे काम करता है इसकी गलतफहमी से प्रदर्शन संबंधी समस्याएं और बग पैदा हो सकते हैं जिनका पता लगाना मुश्किल होता है। यदि कोड का एक टुकड़ा भारी गणना या लंबे समय तक चलने वाले कार्य करता है और ईवेंट लूप को अवरुद्ध करता है, तो सभी सेटटाइमआउट कॉलबैक, वादा समाधान और अन्य अतुल्यकालिक संचालन में देरी होगी जब तक कि ईवेंट लूप मुक्त न हो जाए।
निष्कर्ष
कोड निष्पादन में देरी के लिए सेटटाइमआउट जावास्क्रिप्ट में एक शक्तिशाली उपकरण है, लेकिन इसकी बारीकियों को समझना महत्वपूर्ण है। निर्दिष्ट विलंब फ़ंक्शन को निष्पादन के लिए कतारबद्ध करने से पहले प्रतीक्षा करने का न्यूनतम समय है। वास्तविक निष्पादन समय इवेंट लूप की स्थिति पर निर्भर करता है। एसिंक्रोनस ऑपरेशंस और इवेंट लूप प्रबंधन में महारत हासिल करना कुशल और उत्तरदायी जावास्क्रिप्ट एप्लिकेशन लिखने की कुंजी है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3