परिचय: JavaScript में सामान्य sleep() क्यों नहीं है?
\nनमस्ते, साथी डेवलपर्स! यदि आप कभी Python, PHP या Java से JavaScript पर आए हैं, तो आपने निश्चित रूप से सोचा होगा: "मेरा पसंदीदा sleep(1) कहाँ है, ताकि प्रोग्राम एक सेकंड के लिए सो जाए?" और, दस्तावेज़ीकरण में खोजबीन करने पर, आपको आश्चर्य हुआ होगा कि शुद्ध JS में ऐसा कोई फ़ंक्शन नहीं है।
यह कोई बग नहीं, बल्कि एक फीचर है। JavaScript एक सिंगल-थ्रेडेड भाषा है जो इवेंट लूप (Event Loop) में काम करती है। यदि हम केवल एक सेकंड के लिए थ्रेड को ब्लॉक कर दें, तो इसके साथ पूरा इंटरफ़ेस फ्रीज हो जाएगा, क्लिक, एनिमेशन और अनुरोधों को प्रोसेस करना बंद हो जाएगा। ब्लॉकिंग sleep() वेब के लिए एक एंटी-पैटर्न है।
लेकिन इसका मतलब यह नहीं है कि हम विराम नहीं ले सकते। Stack Overflow पर "What is the JavaScript version of sleep()?" प्रश्न ने सैकड़ों हज़ारों व्यूज़ प्राप्त किए हैं, और 2025 में हमारे पास समाधानों का एक पूरा शस्त्रागार है - सरल से लेकर जटिल तक।
\nइस लेख में (विशेष रूप से शैक्षिक पोर्टल pythonlib.ru के लिए) हम JavaScript को सुलाने के सभी कानूनी तरीकों, उनके फायदे और नुकसान, और विभिन्न स्थितियों के लिए सर्वोत्तम अभ्यासों पर चर्चा करेंगे।
\n\nसबसे सही तरीका: async/await और प्रॉमिसेज़
\nES2017 से शुरू होकर, JavaScript में स्टेरॉयड पर एसिंक्रोनसिटी आई - async/await। यदि आप मुख्य थ्रेड को ब्लॉक किए बिना विराम लेना चाहते हैं, तो आपको एक ऐसे फ़ंक्शन की आवश्यकता है जो एक Promise लौटाता है, जो आवश्यक समय के बाद हल हो जाएगा।
यह रहा, 2025 के लिए हमारा कस्टम sleep():
// यूनिवर्सल डिले फ़ंक्शन\nfunction sleep(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n// उपयोग\nasync function demo() {\n console.log('शुरू कर रहे हैं...');\n await sleep(2000); // 2 सेकंड प्रतीक्षा करें\n console.log('2 सेकंड बीत गए!');\n}\n\ndemo();\n\n\nयह एक नॉन-ब्लॉकिंग sleep है। जब await sleep(2000) निष्पादित हो रहा होता है, तो बाकी कोड (इवेंट हैंडलर, अन्य एसिंक्रोनस फ़ंक्शन) काम करता रहता है। Event Loop सोता नहीं है - यह प्रॉमिस के हल होने तक अगली पंक्तियों के निष्पादन को स्थगित कर देता है।
यह सबसे अच्छा अभ्यास क्यों है?
\n- \n
- UI को ब्लॉक नहीं करता - इंटरफ़ेस प्रतिक्रियाशील रहता है। \n
- मानक सिंटैक्स - सामान्य सिंक्रोनस कोड की तरह पढ़ा जाता है। \n
- Node.js के लिए उपयुक्त - सर्वर हैंग नहीं होता। \n
- हर जगह समर्थित - आधुनिक ब्राउज़र और Node.js 8+। \n
पुराना और भरोसेमंद setTimeout()
\nasync/await के युग से पहले, हम setTimeout() का उपयोग करते थे। यह अभी भी जीवित और प्रासंगिक है, लेकिन इसमें कॉलबैक की आवश्यकता होती है, जो "कॉलबैक हेल" को जन्म देता है।
console.log('शुरू');\nsetTimeout(() => {\n console.log('1.5 सेकंड बीत गए');\n}, 1500);\nconsole.log('समाप्त (तुरंत निष्पादित होगा)');\n\n\nकंसोल आउटपुट इस प्रकार होगा: शुरू, फिर समाप्त (तुरंत), और उसके बाद 1.5 सेकंड बीत गए। यह क्लासिकल अर्थों में बिल्कुल sleep() नहीं है, लेकिन सरल परिदृश्यों के लिए यह आदर्श है।
setTimeout का उपयोग कब करें?
\n- \n
- जब कुछ समय बाद एक बार कोई कार्रवाई करनी हो। \n
- एनिमेशन में (उदाहरण के लिए, 300 ms के बाद प्रभाव शुरू करना)। \n
- जटिल लॉजिक के बिना सरल स्क्रिप्ट में। \n
ब्लॉकिंग sleep (और ऐसा क्यों नहीं करना चाहिए)
\nहाँ, तकनीकी रूप से आप एक खाली लूप का उपयोग करके थ्रेड को फ्रीज़ कर सकते हैं। लेकिन यह शुद्ध बुराई है।
\n\nfunction blockSleep(milliseconds) {\n const start = Date.now();\n while (Date.now() - start < milliseconds) {\n // खाली - प्रोसेसर गर्म होता है, टैब हैंग होता है\n }\n}\n\nconsole.log('शुरुआत');\nblockSleep(3000);\nconsole.log('3 सेकंड बीत गए (लेकिन ब्राउज़र हैंग हो गया)');\n\n\nयह कोड वही करता है जो आप माँगते हैं: निष्पादन रोक देता है