जावास्क्रिप्ट में एसिंक्रोनस प्रोग्रामिंग: एक संपूर्ण गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

जावास्क्रिप्ट में एसिंक्रोनस प्रोग्रामिंग का परिचय



जावास्क्रिप्ट एक सिंगल-थ्रेडेड भाषा है जिसमें नॉन-ब्लॉकिंग इवेंट लूप (Event Loop) होता है। इसका मतलब है कि एक समय में केवल एक ही ऑपरेशन निष्पादित होता है, लेकिन एसिंक्रोनसिटी के कारण हम धीमे कार्यों (फ़ाइल पढ़ना, API अनुरोध, टाइमर) के पूरा होने की प्रतीक्षा किए बिना अन्य कोड का निष्पादन जारी रख सकते हैं। इस लेख में, हम Node.js वातावरण में एसिंक्रोनस प्रोग्रामिंग की सभी प्रमुख अवधारणाओं को कवर करेंगे, कॉलबैक से लेकर आधुनिक async/await सिंटैक्स तक।



एसिंक्रोनस प्रोग्रामिंग उच्च-प्रदर्शन वाले सर्वर एप्लिकेशन बनाने में सक्षम बनाती है जो मुख्य थ्रेड को ब्लॉक किए बिना हजारों अनुरोधों को संसाधित करते हैं। इस प्रतिमान को समझना किसी भी जावास्क्रिप्ट डेवलपर के लिए एक अनिवार्य कौशल है।



1. Callback-फ़ंक्शन और Callback Hell की समस्या



ऐतिहासिक रूप से, जावास्क्रिप्ट में एसिंक्रोनसिटी का पहला तंत्र कॉलबैक (callback) थे - ऐसे फ़ंक्शन जो एसिंक्रोनस ऑपरेशन पूरा होने के बाद कॉल किए जाते हैं।



एक सरल कॉलबैक का उदाहरण



const fs = require('fs');

// फ़ाइल का एसिंक्रोनस पठनfs.readFile('example.txt', 'utf8', (err, data) => { if (err) { console.error('पढ़ने में त्रुटि:', err); return; } console.log('फ़ाइल की सामग्री:', data);});

console.log('यह संदेश फ़ाइल की सामग्री से पहले दिखाई देगा');


समस्या तब उत्पन्न होती है जब कई क्रमिक एसिंक्रोनस ऑपरेशन करने की आवश्यकता होती है। कॉलबैक की नेस्टिंग बढ़ती जाती है, और कोड अपठनीय हो जाता है - इस घटना को "Callback Hell" या "कॉलबैक नरक" कहा जाता है।



Callback Hell का उदाहरण



fs.readFile('file1.txt', (err, data1) => {    if (err) throw err;    fs.readFile('file2.txt', (err, data2) => {        if (err) throw err;        fs.readFile('file3.txt', (err, data3) => {            if (err) throw err;            // तीनों फ़ाइलों का प्रसंस्करण            console.log(data1 + data2 + data3);        });    });});


ऐसे कोड को बनाए रखना, परीक्षण करना और डीबग करना कठिन होता है। इस समस्या का समाधान Promise के आगमन के साथ आया।



2. Promise: Callback Hell से मुक्ति



Promise (वादा) एक ऑब्जेक्ट है जो एक एसिंक्रोनस ऑपरेशन के परिणाम का प्रतिनिधित्व करता है: सफल निष्पादन (resolve) या त्रुटि (reject)। Promise कॉल की श्रृंखला बनाने की अनुमति देता है, जिससे कोड अधिक सपाट और पठनीय हो जाता है।



Promise का निर्माण और उपयोग



// फ़ंक्शन जो Promise लौटाता हैconst readFilePromise = (filename) => {    return new Promise((resolve, reject) => {        fs.readFile(filename, 'utf8', (err, data) => {            if (err) reject(err);            else resolve(data);        });    });};

// उपयोगreadFilePromise('file1.txt') .then(data => { console.log('फ़ाइल पढ़ी गई:', data); return readFilePromise('file2.txt'); }) .then(data => { console.log('दूसरी फ़ाइल:', data); }) .catch(err => { console.error('त्रुटि:', err); });


Promise.all और Promise.race के तरीके



कई एसिंक्रोनस ऑपरेशनों को समानांतर रूप से निष्पादित करने के लिए उपयोगी स्थैतिक विधियाँ मौजूद हैं:



  • Promise.all() — सभी प्रॉमिसेस के पूरा होने की प्रतीक्षा करता है। यदि कम से कम एक त्रुटि के साथ समाप्त होता है, तो पूरा Promise.all rejected स्थिति में चला जाता है।
  • Promise.race() — पहले पूर्ण हुए प्रॉमिस का परिणाम लौटाता है (सफलता या त्रुटि)।
  • Promise.allSettled() — सभी प्रॉमिसेस के पूरा होने की प्रतीक्षा करता है, प्रत्येक के परिणाम लौटाता है (सफलता या त्रुटि)।


const promise1 = readFilePromise('file1.txt');const promise2 = readFilePromise('file2.txt');const promise3 = readFilePromise('file3.txt');

Promise.all([promise1, promise2, promise3]) .then(results => { console.log('सभी फ़ाइलें पढ़ी गईं:', results); }) .catch(err

ब्लॉग

पुस्तक अनुशंसाएँ