जावास्क्रिप्ट में एसिंक्रोनस प्रोग्रामिंग का परिचय
\n\nजावास्क्रिप्ट एक सिंगल-थ्रेडेड प्रोग्रामिंग भाषा है। इसका मतलब है कि किसी भी समय केवल एक ही ऑपरेशन निष्पादित होता है। हालाँकि, यदि सभी ऑपरेशन क्रमिक रूप से निष्पादित होते, तो सर्वर से डेटा लोड करने या फ़ाइल पढ़ने पर ब्राउज़र "हैंग" हो जाता। यहीं पर एसिंक्रोनस प्रोग्रामिंग काम आती है।
\n\nएसिंक्रोनस प्रोग्रामिंग मुख्य निष्पादन थ्रेड को ब्लॉक किए बिना लंबी अवधि के ऑपरेशन (API अनुरोध, फ़ाइल पढ़ना, टाइमर) करने की अनुमति देता है। कार्य पूरा होने की प्रतीक्षा करने के बजाय, कोड निष्पादित होता रहता है, और परिणाम बाद में संसाधित किया जाता है। Node.js पर तेज़ और उत्तरदायी एप्लिकेशन बनाने के लिए यह एक महत्वपूर्ण अवधारणा है।
\n\nइस गाइड में, हम एसिंक्रोनस प्रोग्रामिंग के तीन मुख्य दृष्टिकोणों पर चर्चा करेंगे: कॉलबैक, प्रॉमिस और async/await सिंटैक्स। आप सीखेंगे कि एसिंक्रोनस कोड के साथ सही तरीके से कैसे काम करें और शुरुआती लोगों की सामान्य गलतियों से कैसे बचें।
1. कॉलबैक (Callbacks): एसिंक्रोनसिटी का आधार
\n\nकॉलबैक (callback) एक फ़ंक्शन है जिसे किसी अन्य फ़ंक्शन में तर्क के रूप में पास किया जाता है और एसिंक्रोनस ऑपरेशन पूरा होने के बाद कॉल किया जाता है। जावास्क्रिप्ट में एसिंक्रोनसिटी के साथ काम करने का यह सबसे पुराना और बुनियादी तरीका है।
\n\nsetTimeout के साथ उदाहरण
\n\nबिल्ट-इन फ़ंक्शन setTimeout एसिंक्रोनस ऑपरेशन का एक क्लासिक उदाहरण है। यह एक कॉलबैक और मिलीसेकंड में देरी लेता है:
console.log('शुरू');\n\nsetTimeout(() => {\n console.log('2 सेकंड बीत गए');\n}, 2000);\n\nconsole.log('अंत');\n\n// आउटपुट:\n// शुरू\n// अंत\n// 2 सेकंड बीत गए\n\nध्यान दें: "अंत" कॉलबैक से संदेश से पहले प्रिंट होता है। यही एसिंक्रोनसिटी है — कोड setTimeout के पूरा होने की प्रतीक्षा नहीं करता।
"Callback Hell" की समस्या
\n\nजब आपके पास कई नेस्टेड एसिंक्रोनस ऑपरेशन होते हैं, तो कोड पढ़ने में मुश्किल हो जाता है। इस घटना को "कॉलबैक हेल" (Callback Hell) कहा जाता है:
\n\nfs.readFile('file1.txt', (err, data1) => {\n if (err) throw err;\n fs.readFile('file2.txt', (err, data2) => {\n if (err) throw err;\n fs.readFile('file3.txt', (err, data3) => {\n if (err) throw err;\n console.log(data1, data2, data3);\n });\n });\n});\n\nऐसे कोड को बनाए रखना और डीबग करना कठिन है। सौभाग्य से, आधुनिक जावास्क्रिप्ट अधिक सुरुचिपूर्ण समाधान प्रदान करता है।
\n\n2. प्रॉमिस (Promises): एसिंक्रोनसिटी का सुरुचिपूर्ण प्रबंधन
\n\nPromise (प्रॉमिस, वादा) एक ऑब्जेक्ट है जो एसिंक्रोनस ऑपरेशन के परिणाम का प्रतिनिधित्व करता है। प्रॉमिस तीन अवस्थाओं में से एक में हो सकता है:
\n\n- \n
- Pending (लंबित) — प्रारंभिक अवस्था, ऑपरेशन अभी पूरा नहीं हुआ है \n
- Fulfilled (पूरा) — ऑपरेशन सफलतापूर्वक पूरा हो गया है \n
- Rejected (अस्वीकृत) — ऑपरेशन त्रुटि के साथ पूरा हुआ है \n
Promise का निर्माण और उपयोग
\n\nconst myPromise = new Promise((resolve, reject) => {\n setTimeout(() => {\n const success = true;\n if (success) {\n resolve('डेटा प्राप्त हुआ');\n } else {\n reject('डेटा प्राप्त करने में त्रुटि');\n }\n }, 2000);\n});\n\nmyPromise\n .then(result => {\n console.log(result); // "डेटा प्राप्त हुआ"\n })\n .catch(error => {\n console.error(error); // "डेटा प्राप्त करने में त्रुटि"\n })\n .finally(() => {\n console.log('ऑपरेशन पूरा हुआ');\n });\n\nप्रॉमिस चेनिंग (Chaining)
\n\nप्रॉमिस को चेन में जोड़ा जा सकता है, जो "कॉलबैक हेल" से बचने में मदद करता है:
\n\nfunction readFile(filename) {\n return new Promise((resolve, reject) => {\n fs.readFile(filename, 'utf8', (err, data) => {\n if (err) reject(err);\n else resolve(data);\n });\n });\n}\n\nreadFile('file1.txt')\n .then(data1 => {\