Node.js प्रॉमिस ट्यूटोरियल

⚡ स्मार्ट सारांश

Node.js में प्रॉमिसेज़ गहरे नेस्टेड कॉलबैक को एक ऐसे ऑब्जेक्ट से बदल देते हैं जो एक बार सेटल हो जाता है, इसलिए एसिंक्रोनस डेटाबेस का काम अनाम फ़ंक्शंस के पिरामिड के बजाय then क्लॉज़ की एक सपाट श्रृंखला के रूप में पढ़ा जाता है।

  • 🔘 कॉलबैक समस्या: नेस्टेड कॉलबैक लंबे हो जाते हैं और उनका रखरखाव करना कठिन हो जाता है।
  • वादे की बुनियादी बातें: प्रॉमिस एक वैल्यू लौटाता है और ठीक एक बार सेटल होता है।
  • जंजीर: then स्वयं एक प्रॉमिस लौटाता है, इसलिए इंसर्ट क्रम से चलते हैं।
  • 🧪 कस्टम वादे: q लाइब्रेरी का denodeify किसी भी कॉलबैक को रैप करता है।
  • आधुनिक रूप: async और await बिना then कॉलबैक के प्रॉमिस का उपयोग करते हैं।
  • 📊 त्रुटि नियम: संस्करण 15 के बाद से अनहैंडल्ड रिजेक्शन के कारण Node.js बंद हो जाता है।

Node.js प्रॉमिस ट्यूटोरियल जिसमें प्रॉमिस में चेन किए गए कॉलबैक दिखाए गए हैं

पिछले ट्यूटोरियल में, आपने कॉलबैक फ़ंक्शन देखे होंगे जो एसिंक्रोनस इवेंट के लिए उपयोग किए जाते हैं। लेकिन कभी-कभी कॉलबैक फ़ंक्शन एक दुःस्वप्न बन सकते हैं जब वे नेस्टेड होने लगते हैं, और प्रोग्राम लंबा और जटिल होने लगता है।

वादे क्या हैं?

प्रॉमिस शुरू करने से पहले, आइए पहले यह समझ लें कि "कॉलबैक" फ़ंक्शन क्या होते हैं। Node.jsहमने पिछले अध्यायों में इन कॉलबैक फ़ंक्शंस को कई बार देखा है, तो चलिए उनमें से एक को जल्दी से समझ लेते हैं।

नीचे दिया गया उदाहरण एक कोड स्निपेट दिखाता है, जिसका उपयोग किसी से कनेक्ट करने के लिए किया जाता है MongoDB डेटाबेस पर जाएँ और डेटाबेस में मौजूद किसी एक रिकॉर्ड पर अद्यतन ऑपरेशन करें।

Node.js कॉलबैक फ़ंक्शन कनेक्ट हो रहा है MongoDB और एक रिकॉर्ड को अपडेट करना

  1. उपरोक्त कोड में, फ़ंक्शन (err,db) का भाग एक अनाम या कॉलबैक फ़ंक्शन की घोषणा के रूप में जाना जाता है। जब MongoClient एक कनेक्शन बनाता है MongoDB डेटाबेस, कनेक्शन ऑपरेशन पूरा होने के बाद यह कॉलबैक फ़ंक्शन पर वापस आ जाएगा। तो एक तरह से, कनेक्शन ऑपरेशन पृष्ठभूमि में होते हैं, और जब यह पूरा हो जाता है, तो यह हमारे कॉलबैक फ़ंक्शन को कॉल करता है। याद रखें कि यह Node.js के मुख्य बिंदुओं में से एक है जो कई ऑपरेशनों को एक साथ होने देता है और इस प्रकार किसी भी उपयोगकर्ता को ऑपरेशन करने से नहीं रोकता है।
  2. दूसरा कोड ब्लॉक वह है जो तब निष्पादित होता है जब कॉलबैक फ़ंक्शन वास्तव में कॉल किया जाता है। कॉलबैक फ़ंक्शन हमारे में केवल एक रिकॉर्ड को अपडेट करता है MongoDB डेटाबेस।

तो फिर वादा क्या है? खैर, वादा Node.js में कॉलबैक फ़ंक्शन के लिए सिर्फ़ एक संवर्द्धन है। विकास जीवनचक्र के दौरान, ऐसा कोई उदाहरण हो सकता है जहाँ आपको कई कॉलबैक फ़ंक्शन को एक साथ जोड़ने की ज़रूरत होगी। यह एक निश्चित समय पर गड़बड़ और बनाए रखना मुश्किल हो सकता है। संक्षेप में, वादा कॉलबैक के लिए एक संवर्द्धन है जो इन समस्याओं को कम करने की ओर देखता है।

वादे का मूल वाक्यविन्यास नीचे दिखाया गया है;

var promise = doSomethingAync()
promise.then(onFulfilled, onRejected)
  • “doSomethingAync” कोई भी कॉलबैक या एसिंक्रोनस फ़ंक्शन है जो किसी प्रकार की प्रोसेसिंग करता है।
  • इस बार, कॉलबैक को परिभाषित करते समय, एक मान लौटाया जाता है जिसे "वादा" कहा जाता है।
  • जब कोई वादा वापस किया जाता है, तो उसके 2 आउटपुट हो सकते हैं। इसे 'then क्लॉज' द्वारा परिभाषित किया जाता है। या तो ऑपरेशन सफल हो सकता है जिसे 'onFulfilled' पैरामीटर द्वारा दर्शाया जाता है। या इसमें एक त्रुटि हो सकती है जिसे 'onRejected' पैरामीटर द्वारा दर्शाया जाता है।

A वादा तीन राज्यों में से किसी एक में बैठता है और एक बार स्थिर हो जाता है:

राज्य अर्थ
अपूर्ण काम अभी खत्म नहीं हुआ है।
पूरा onFulfilled मान के साथ चलता है।
अस्वीकृत onRejected त्रुटि के साथ चलता है।

नोट: इसलिए वादे का मुख्य पहलू रिटर्न वैल्यू है। Node.js में सामान्य कॉलबैक के साथ काम करते समय रिटर्न वैल्यू की कोई अवधारणा नहीं होती है। रिटर्न वैल्यू की वजह से, हमारे पास इस बात पर अधिक नियंत्रण होता है कि कॉलबैक फ़ंक्शन को कैसे परिभाषित किया जा सकता है।

संस्करण नोट: ये उदाहरण अभी भी Node.js 24 पर चलते हैं, जो 2026 में सक्रिय LTS लाइन होगी। Node.js 15 के बाद से... असंबोधित अस्वीकृति यह चेतावनी छापने के बजाय प्रक्रिया को समाप्त करता है, इसलिए प्रत्येक चेन को .catch() से बंद करें।

अगले विषय में, हम वादों का एक उदाहरण देखेंगे और देखेंगे कि वे कॉलबैक से कैसे लाभान्वित होते हैं।

वादों पर वापस लौटना

अब आइए एक उदाहरण देखें कि हम Node.js एप्लिकेशन के भीतर से "वादों" का उपयोग कैसे कर सकते हैं। Node.js एप्लिकेशन में वादों का उपयोग करने के लिए, 'वादा' मॉड्यूल को पहले डाउनलोड और इंस्टॉल किया जाना चाहिए।

इसके बाद हम अपने कोड को नीचे दिखाए अनुसार संशोधित करेंगे, जो प्रॉमिसेस का उपयोग करके 'Employee' कलेक्शन में EmployeeName को अपडेट करता है।

चरण 1) स्थापित कर रहा है एनपीएम मॉड्यूल

Node.js एप्लिकेशन में प्रॉमिस का उपयोग करने के लिए, प्रॉमिस मॉड्यूल आवश्यक है। प्रॉमिस मॉड्यूल को इंस्टॉल करने के लिए, नीचे दिए गए कमांड को चलाएं।

एनपीएम इंस्टॉल वादा

चरण 2) वादे शामिल करने के लिए कोड को संशोधित करें

प्रॉमिस मॉड्यूल को फिर से लिखने का एडिटर स्क्रीनशॉट MongoDB अद्यतन

var Promise = require('promise');
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost/EmployeeDB';

MongoClient.connect(url)
    .then(function(err, db) {
        db.collection('Employee').updateOne({
            "EmployeeName": "Martin"
        }, {
            $set: {
                "EmployeeName": "Mohan"
            }
        });
    }); 

Code स्पष्टीकरण:

  1. पहला भाग 'प्रॉमिस' मॉड्यूल को शामिल करना है जो हमें अपने कोड में प्रॉमिस कार्यक्षमता का उपयोग करने की अनुमति देगा।
  2. अब हम अपने MongoClient.connect फ़ंक्शन में 'then' फ़ंक्शन जोड़ सकते हैं। तो यह क्या करता है कि जब डेटाबेस से कनेक्शन स्थापित हो जाता है, तो हमें उसके बाद परिभाषित कोड स्निपेट को निष्पादित करने की आवश्यकता होती है।
  3. अंत में, हम अपना कोड स्निपेट परिभाषित करते हैं जो कर्मचारी के EmployeeName को “मार्टिन” नाम से “मोहन” में अपडेट करने का काम करता है।

नोट:

यदि आप अब अपनी वेबसाइट की सामग्री की जांच करते हैं, MongoDB डेटाबेस में, आप पाएंगे कि यदि “मार्टिन” के कर्मचारी नाम वाला कोई रिकॉर्ड मौजूद है, तो इसे “मोहन” में अपडेट कर दिया जाएगा।

यह जांचने के लिए कि डाटाबेस में डाटा सही तरीके से डाला गया है, आपको निम्नलिखित कमांड निष्पादित करने की आवश्यकता है MongoDB

  1. कर्मचारी डेटाबेस का उपयोग करें
  2. db.Employee.find({EmployeeName : “मोहन”})

पहला कथन यह सुनिश्चित करता है कि आप EmployeeDB डेटाबेस से जुड़े हुए हैं। दूसरा कथन उस रिकॉर्ड को खोजता है जिसमें कर्मचारी का नाम "मोहन" है।

नेस्टेड वादों से निपटना

वादों को परिभाषित करते समय, यह ध्यान रखना आवश्यक है कि “then” विधि स्वयं एक वादा लौटाती है। इसलिए एक अर्थ में, वादे एक दूसरे से नेस्टेड या चेन किए जा सकते हैं।

नीचे दिए गए उदाहरण में, हम 2 कॉलबैक फ़ंक्शन को परिभाषित करने के लिए चेनिंग का उपयोग करते हैं, जो दोनों एक रिकॉर्ड को सम्मिलित करते हैं MongoDB डेटाबेस।

(नोट: चेनिंग एक अवधारणा है जिसका उपयोग विधियों के निष्पादन को एक दूसरे से जोड़ने के लिए किया जाता है। मान लीजिए कि आपके एप्लिकेशन में 'methodA' और 'methodB' नामक 2 विधियाँ हैं। और तर्क ऐसा था कि 'methodB' को 'methodA' के बाद बुलाया जाना चाहिए, तो आप निष्पादन को इस तरह से चेन करेंगे कि 'methodB' को 'methodA' के ठीक बाद बुलाया जाए।)

इस उदाहरण में ध्यान देने योग्य मुख्य बात यह है कि नेस्टेड प्रॉमिस का उपयोग करने से कोड अधिक स्वच्छ, पठनीय और रखरखाव योग्य हो जाता है।

दो कर्मचारी रिकॉर्ड सम्मिलित करने वाले श्रृंखलाबद्ध खंड MongoDB

var Promise = require('promise');
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost/EmployeeDB';
MongoClient.connect(url)

.then(function(db) {
    db.collection('Employee').insertOne({
        Employeeid: 4,
        EmployeeName: "NewEmployee"
    })

    .then(function(db1) {
        db1.collection('Employee').insertOne({
            Employeeid: 5,
            EmployeeName: "NewEmployee1"
        })
    })
});

Code स्पष्टीकरण:

  1. अब हम 2 “then” क्लॉज परिभाषित कर रहे हैं जो एक के बाद एक निष्पादित होते हैं। पहले then क्लॉज में, हम 'db' पैरामीटर पास कर रहे हैं जिसमें हमारा डेटाबेस कनेक्शन शामिल है। फिर हम 'db' कनेक्शन की कलेक्शन प्रॉपर्टी का उपयोग करके 'Employee' कलेक्शन में रिकॉर्ड डाल रहे हैं। 'insertOne' विधि का उपयोग कर्मचारी कलेक्शन में वास्तविक दस्तावेज़ डालने के लिए किया जाता है।
  2. फिर हम 2 का उपयोग कर रहे हैंnd फिर डेटाबेस में एक और रिकॉर्ड डालने के लिए भी खंड।

यदि आप अब अपनी वेबसाइट की सामग्री की जांच करते हैं, MongoDB डेटाबेस में, आपको डाले गए 2 रिकॉर्ड मिलेंगे। MongoDB डेटाबेस।

आधुनिक समकक्ष: ES2017 से मानक बन चुके async और await, बिना then कॉलबैक के इन प्रॉमिसेस का उपयोग करते हैं और इन्होंने इन्हें काफी हद तक प्रतिस्थापित कर दिया है। जनरेटर-आधारित co जैसी फ्लो-कंट्रोल लाइब्रेरी का उपयोग किया जा सकता है, जबकि नेटिव प्रॉमिस सपोर्ट q और ब्लूबर्ड को अनावश्यक बना देता है। दूसरा ब्लॉक केवल db प्राप्त करने को दर्शाता है।

कस्टम वादा बनाना

Node.js में 'q' नामक मॉड्यूल का उपयोग करके एक कस्टम प्रॉमिस बनाया जा सकता है। 'q' लाइब्रेरी को Node पैकेज मैनेजर का उपयोग करके डाउनलोड और इंस्टॉल करना आवश्यक है। 'q' लाइब्रेरी का उपयोग करने के बाद, "denodeify" मेथड को कॉल किया जा सकता है, जिससे कोई भी फ़ंक्शन एक प्रॉमिस रिटर्न करने वाले फ़ंक्शन में बदल जाएगा।

नीचे दिए गए उदाहरण में, हम “Add” नामक एक सरल फ़ंक्शन बनाएंगे जो 2 संख्याओं को जोड़ेगा। हम इस फ़ंक्शन को एक वादा वापस करने वाले फ़ंक्शन में बदल देंगे।

एक बार ऐसा हो जाने पर, हम कंसोल.लॉग में संदेश प्रदर्शित करने के लिए Add फ़ंक्शन द्वारा लौटाए गए वादे का उपयोग करेंगे।

आइये, वादा वापस करने के लिए अपना कस्टम फ़ंक्शन बनाने हेतु नीचे दिए गए चरणों का पालन करें।

चरण 1) एनपीएम मॉड्यूल स्थापित करना

Node.js एप्लिकेशन के भीतर 'q' का उपयोग करने के लिए, 'q' मॉड्यूल आवश्यक है। 'q' मॉड्यूल को इंस्टॉल करने के लिए, नीचे दिए गए कमांड को चलाएँ।

एनपीएम इंस्टॉल क्यू

चरण 2) निम्नलिखित कोड को परिभाषित करें जिसका उपयोग कस्टम वादा बनाने के लिए किया जाएगा।

रैप द्वारा निर्मित कस्टम वादाping q के साथ एक जोड़ फ़ंक्शन को denodeify करें

Code स्पष्टीकरण:

  1. पहला काम require कीवर्ड का उपयोग करके 'q' लाइब्रेरी को शामिल करना है। इस लाइब्रेरी का उपयोग करके, हम कॉलबैक लौटाने के लिए कोई भी फ़ंक्शन परिभाषित कर पाएँगे।
  2. हम Add नामक एक फ़ंक्शन बना रहे हैं जो चर a और b में परिभाषित 2 संख्याओं को जोड़ेगा। इन मानों का योग चर c में संग्रहीत किया जाएगा।
  3. फिर हम q लाइब्रेरी का उपयोग करके अपने Add फ़ंक्शन को डिनॉइफाई (किसी भी फ़ंक्शन को प्रॉमिस लौटाने वाले फ़ंक्शन में बदलने की विधि) कर रहे हैं, या दूसरे शब्दों में, अपने Add फ़ंक्शन को एक ऐसे फ़ंक्शन में बदल रहे हैं जो प्रॉमिस लौटाता है।
  4. अब हम अपने "Add" फ़ंक्शन को कॉल करते हैं और रिटर्न प्रॉमिस वैल्यू प्राप्त करने में सक्षम हैं, क्योंकि हमने पहले Add फ़ंक्शन को डीनोडीफाई करने का चरण पूरा किया था।
  5. 'then' कीवर्ड का उपयोग यह निर्दिष्ट करने के लिए किया जाता है कि यदि फ़ंक्शन सफलतापूर्वक निष्पादित हो जाता है तो console.log में "Addition function completed" स्ट्रिंग प्रदर्शित करें।

जब उपरोक्त कोड चलाया जाता है, तो आउटपुट “एडिशन फ़ंक्शन पूरा हुआ” कंसोल.लॉग में प्रदर्शित किया जाएगा जैसा कि नीचे दिखाया गया है।

कंसोल आउटपुट प्रिंटिंग कस्टम प्रॉमिस से जोड़ फ़ंक्शन पूरा हुआ

अक्सर पूछे जाने वाले प्रश्न

Node.js 15 के बाद से, प्रक्रिया चेतावनी के बजाय एक गैर-शून्य कोड के साथ समाप्त हो जाती है। प्रत्येक चेन में .catch() संलग्न करें, या एक पंजीकृत करें प्रक्रिया हैंडलर लॉग करने और पुनर्प्राप्त करने के लिए।

.catch() ब्लॉक, ट्राई ब्लॉक की तरह, श्रृंखला में पहले फेंकी गई किसी भी त्रुटि को प्राप्त करता है। .finally() ब्लॉक श्रृंखला के निर्धारित क्रम के अनुसार चलता है, इसलिए यह कनेक्शन को समाप्त करने के लिए उपयुक्त है।

Promise.all एक इनपुट के अस्वीकार होने पर तुरंत विफल हो जाता है। allSettled हमेशा हल होता है और सभी परिणामों की रिपोर्ट करता है। race पहले हल हुए परिणाम को अपनाता है। any को एक सफलता की आवश्यकता होती है, अन्यथा AggregateError उत्पन्न होता है।

दोनों एक ही प्रॉमिस का उपयोग करते हैं। await एक एसिंक्रोनस फ़ंक्शन के अंदर रुकता है, इसलिए परिणाम सामान्य वैरिएबल में आते हैं और त्रुटियां ट्राई और कैच ब्लॉक तक पहुंचती हैं।

शायद ही कभी। Generator एक समय में yield वाले फ़ंक्शन co जैसी लाइब्रेरी को संचालित करते थे, लेकिन async और await उस काम को स्वाभाविक रूप से पूरा करते हैं। Generatorये अभी भी लेज़ी सीक्वेंस और कस्टम इटरेटर के लिए उपयुक्त हैं।

util.promisify सीधे कॉलबैक-शैली फ़ंक्शन को परिवर्तित करता है, और fs.promises जैसे मॉड्यूल पहले से ही प्रॉमिसेस वापस देते हैं। ये दोनों ऊपर दिखाए गए q लाइब्रेरी का विकल्प हैं।

हाँ। मशीन-लर्निंग विश्लेषक रिजेक्शन हैंडलर के बिना चेन, लूप के अंदर प्रतीक्षा और क्रम-निर्भर लेखन को चिह्नित करते हैं, फिर निष्कर्षों को रैंक करते हैं। परीक्षण सबसे जोखिम भरे रास्तों पर चलें।

गिटहब कोपिलॉट और इसी तरह के एजेंटिक सहायक नेस्टेड कॉलबैक को await कॉल के रूप में तेजी से पुनर्लेखन करते हैं, फिर भी प्रत्येक पुनर्लेखन की समीक्षा की आवश्यकता होती है क्योंकि त्रुटि पथ और मार्ग शब्दार्थ चुपचाप बदल जाते हैं।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: