जावास्क्रिप्ट में एसिंक्रोनस प्रोग्रामिंग का परिचय
जावास्क्रिप्ट एक सिंगल-थ्रेडेड प्रोग्रामिंग भाषा है जिसमें नॉन-ब्लॉकिंग इनपुट-आउटपुट मॉडल है। इसका मतलब है कि एक समय में केवल एक ही ऑपरेशन निष्पादित होता है। हालाँकि, एसिंक्रोनस प्रोग्रामिंग के कारण, Node.js मुख्य थ्रेड को ब्लॉक किए बिना एक साथ हजारों अनुरोधों को संभाल सकता है। इस लेख में, हम एसिंक्रोनसिटी की मुख्य अवधारणाओं को समझेंगे: कॉलबैक (callbacks), प्रॉमिस (Promises) और async/await सिंटैक्स।
एसिंक्रोनसिटी क्या है और इसकी आवश्यकता क्यों है?
कल्पना करें कि आप पिज़्ज़ा ऑर्डर कर रहे हैं। यदि आप काउंटर पर खड़े होकर इसके तैयार होने का इंतज़ार करते हैं — यह सिंक्रोनस कोड है। बाकी सब कुछ रुक जाता है। एसिंक्रोनस दृष्टिकोण — आपने ऑर्डर दिया और अपने काम में लग गए। जब पिज़्ज़ा तैयार होता है, तो आपको बुलाया जाता है। जावास्क्रिप्ट बिल्कुल इसी तरह काम करता है: यह किसी ऑपरेशन (फ़ाइल पढ़ना, सर्वर से अनुरोध) के पूरा होने की प्रतीक्षा नहीं करता, बल्कि अगला कोड निष्पादित करना जारी रखता है। जब ऑपरेशन पूरा होता है, तो एक विशेष फ़ंक्शन — कॉलबैक — कॉल किया जाता है।
Node.js में, एसिंक्रोनसिटी विशेष रूप से महत्वपूर्ण है क्योंकि सर्वर को एक साथ कई क्लाइंट्स की सेवा करनी होती है। इसके बिना, प्रत्येक नया अनुरोध पूरे एप्लिकेशन के काम को ब्लॉक कर देगा।
सिंक्रोनस बनाम एसिंक्रोनस कोड: उदाहरण
फ़ाइल पढ़ने का एक सरल उदाहरण देखें। सिंक्रोनस विकल्प निष्पादन को ब्लॉक करता है:
const fs = require('fs');
// सिंक्रोनस रीडिंग — थ्रेड को ब्लॉक करता हैconst data = fs.readFileSync('file.txt', 'utf8');console.log('डेटा पढ़ा गया:', data);console.log('यह कोड फ़ाइल पढ़ने के बाद ही निष्पादित होगा');एसिंक्रोनस विकल्प ब्लॉक नहीं करता:
const fs = require('fs');
// एसिंक्रोनस रीडिंग — ब्लॉक नहीं करताfs.readFile('file.txt', 'utf8', (err, data) => { if (err) throw err; console.log('डेटा पढ़ा गया:', data);});
console.log('यह कोड तुरंत निष्पादित होगा, फ़ाइल पढ़ने की प्रतीक्षा किए बिना');एसिंक्रोनसिटी के साथ काम करने के मुख्य तरीके
जावास्क्रिप्ट (और Node.js) में एसिंक्रोनस प्रोग्रामिंग के तीन मुख्य दृष्टिकोण हैं। हम उन्हें सबसे पुराने से लेकर आधुनिक तक देखेंगे।
1. Callback (कॉलबैक फ़ंक्शन)
कॉलबैक एक फ़ंक्शन है जिसे दूसरे फ़ंक्शन में पास किया जाता है और एसिंक्रोनस ऑपरेशन पूरा होने के बाद कॉल किया जाता है। यह सबसे बुनियादी और पुरानी विधि है।
function getUserData(userId, callback) { setTimeout(() => { const user = { id: userId, name: 'अन्ना' }; callback(null, user); // पहला आर्गुमेंट — त्रुटि (यदि है) }, 1000);}
getUserData(1, (err, user) => { if (err) { console.error('त्रुटि:', err); return; } console.log('उपयोगकर्ता:', user.name);});समस्या: जब बहुत सारे ऑपरेशन होते हैं, तो कोड "कॉलबैक हेल" (callback hell) में बदल जाता है — गहराई से नेस्टेड फ़ंक्शन जिन्हें पढ़ना और डीबग करना मुश्किल होता है।
2. Promise (प्रॉमिस)
Promise एक ऑब्जेक्ट है जो एसिंक्रोनस ऑपरेशन के परिणाम का प्रतिनिधित्व करता है। यह तीन अवस्थाओं में से एक में हो सकता है:
- pending (प्रतीक्षा) — ऑपरेशन अभी पूरा नहीं हुआ है
- fulfilled (पूर्ण) — ऑपरेशन सफलतापूर्वक पूरा हुआ
- rejected (अस्वीकृत) — ऑपरेशन त्रुटि के साथ पूरा हुआ
प्रॉमिस कॉलबैक हेल की समस्या को हल करते हैं और कोड को अधिक रैखिक बनाते हैं:
function getUserData(userId) { return new Promise((resolve, reject) => { setTimeout(() => { const user = { id: userId, name: 'इवान' }; // resolve — सफलता, reject — त्रुटि resolve(user); // reject(new Error('उपयोगकर्ता नहीं मिला')); }, 1000); });}
// .then() चेन का उपयोगgetUserData(1) .then(user => { console.log('उपयोगकर्ता:', user.name); return user.id; }) .then(id => console.log('ID:', id)) .catch(err => console.error('त्रुटि:', err)) .finally(() => console.log('ऑपरेशन पूरा हुआ'));
ब्लॉग
पुस्तक अनुशंसाएँ
यह भी पढ़ें