Node.js Generators & कॉलबैक के साथ तुलना करें

इस ट्यूटोरियल में, हम इसके बारे में सीखने जा रहे हैं Generatorकॉलबैक के साथ उनके अंतर और अंतर

जनरेटर क्या हैं?

Generatorमें काफी प्रसिद्ध हो गए हैं Node.js हाल के दिनों में ऐसा हुआ है और ऐसा संभवतः इसलिए है क्योंकि वे कुछ करने में सक्षम हैं।

  • Generators फ़ंक्शन निष्पादन हैं जिन्हें बाद में निलंबित और पुनः शुरू किया जा सकता है।
  • Generator'आलसी निष्पादन' जैसी अवधारणाओं को पूरा करते समय ये उपयोगी होते हैं। इसका मूल रूप से मतलब है कि निष्पादन को निलंबित करके और इच्छानुसार फिर से शुरू करके, हम केवल तभी मान खींच पाते हैं जब हमें इसकी आवश्यकता होती है।

Generatorइसमें नीचे दी गई 2 प्रमुख विधियां हैं।

  1. उपज विधि – यील्ड विधि को फ़ंक्शन में उस विशिष्ट पंक्ति पर फ़ंक्शन के निष्पादन को रोकने के लिए बुलाया जाता है जहां यील्ड विधि को बुलाया जाता है।
  2. अगली विधि - इस विधि को मुख्य एप्लीकेशन से उस फ़ंक्शन के निष्पादन को फिर से शुरू करने के लिए बुलाया जाता है जिसमें यील्ड विधि होती है। फ़ंक्शन का निष्पादन अगली यील्ड विधि या विधि के अंत तक जारी रहेगा।

आइये एक उदाहरण देखें कि जनरेटर का उपयोग कैसे किया जा सकता है।

हमारे उदाहरण में, हम एक सरल Add फंक्शन का उपयोग करने जा रहे हैं जो 2 संख्याओं को जोड़ेगा, लेकिन हम विभिन्न बिंदुओं पर विधि निष्पादन को रोकते रहेंगे ताकि यह दिखाया जा सके कि जनरेटर का उपयोग कैसे किया जा सकता है।

Node.js Generators

function* Add(x) {
   yield x + 1;
   var y = yield(null);
   y = 6
   return x + y;
}

var gen = Add(5);

gen.next();

gen.next(); 

कोड स्पष्टीकरण

  1. पहला कदम हमारे जनरेटर "फ़ंक्शन" को परिभाषित करना है। ध्यान दें कि यह फ़ंक्शन कीवर्ड में "*" जोड़कर किया जाता है। फिर हम Add नामक एक फ़ंक्शन को परिभाषित कर रहे हैं जो x का एक पैरामीटर लेता है।
  2. यील्ड कीवर्ड जेनरेटर के लिए विशिष्ट है। यह इसे किसी भी चीज़ के बीच में फ़ंक्शन को रोकने के लिए एक शक्तिशाली निर्माण बनाता है। इसलिए यहाँ, फ़ंक्शन निष्पादन तब तक रुका रहेगा जब तक हम next() फ़ंक्शन को लागू नहीं करते, जो कि चरण 4 में किया जाएगा। इस बिंदु पर, x का मान 6 हो जाएगा और फ़ंक्शन का निष्पादन रोक दिया जाएगा।
  3. यह वह जगह है जहाँ हम सबसे पहले जनरेटर फ़ंक्शन को कॉल करते हैं और 5 का मान हमारे ऐड फ़ंक्शन को भेजते हैं। यह मान हमारे ऐड फ़ंक्शन के x पैरामीटर में प्रतिस्थापित किया जाएगा।
  4. एक बार जब हम next() फ़ंक्शन को कॉल करते हैं, तो Add() फ़ंक्शन निष्पादन को फिर से शुरू कर देगा। जब अगला कथन var y= yield(null) निष्पादित किया जाएगा, तो Add() फ़ंक्शन फिर से निष्पादन बंद कर देगा।
  5. अब next() फ़ंक्शन को पुनः कॉल करने पर next स्टेटमेंट चलेंगे और x=5 तथा y=6 का संयुक्त मान जोड़कर लौटाया जाएगा।

कॉलबैक बनाम जेनरेटर

Generators का उपयोग कॉलबैक हेल के रूप में जानी जाने वाली समस्या को हल करने के लिए किया जाता है। कभी-कभी Node.js एप्लिकेशन के विकास के दौरान कॉलबैक फ़ंक्शन इतने नेस्टेड हो जाते हैं कि कॉलबैक फ़ंक्शन का उपयोग करना बहुत जटिल हो जाता है।

यहीं पर जेनरेटर उपयोगी होते हैं। इसका सबसे आम उदाहरण टाइमर फ़ंक्शन बनाते समय है।

आइए नीचे दिए गए उदाहरण को देखें कि कैसे जेनरेटर कॉलबैक पर उपयोगी साबित हो सकते हैं।

हमारा उदाहरण बस एक सरल समय विलंब फ़ंक्शन बनाएगा। फिर हम 1000, 2000 और 3000 ms की देरी को शामिल करते हुए इस फ़ंक्शन को कॉल करना चाहेंगे।

चरण 1) आवश्यक समय विलंब कोड के साथ हमारे कॉलबैक फ़ंक्शन को परिभाषित करें।

कॉलबैक बनाम. Generators

function Timedelay(ptime, callback) {

setTimeout(function() {
  
    callback("Pausing for " + ptime);
    
  }, time);
}

कोड स्पष्टीकरण

  1. यहाँ हम Timedelay नामक एक फ़ंक्शन बना रहे हैं, जिसमें ptime नामक पैरामीटर है। यह हमारे एप्लिकेशन में आवश्यक समय विलंब लेगा।
  2. अगला चरण बस एक संदेश बनाना है, जो उपयोगकर्ता को यह बताते हुए दिखाया जाएगा कि एप्लीकेशन इतने मिलीसेकंड के लिए रुका हुआ है।

चरण 2) अब आइए कोड को देखें कि क्या हम कॉलबैक को शामिल कर रहे हैं। मान लीजिए कि हम 1000, 2000 और 3000 मिलीसेकंड के मान के आधार पर कॉलबैक को शामिल करना चाहते हैं, तो नीचे दिया गया कोड दिखाता है कि हमें कॉलबैक का उपयोग करके इन्हें कैसे लागू करना होगा।

कॉलबैक बनाम. Generators

Timedelay(1000, function(message) {
  
  console.log(msg);
  Timedelay(2000, function(message) {
    
    console.log(msg);
    Timedelay(3000, function(message) {
      
      console.log(msg);
  })
  })
})

कोड स्पष्टीकरण

  1. हम Timedelay को 1000 मान के साथ कॉलबैक के रूप में कॉल कर रहे हैं।
  2. अब हम Timedelay फ़ंक्शन को 2000 मान के साथ पुनः कॉल करना चाहते हैं।
  3. अंत में, हम Timedelay फ़ंक्शन को 3000 मान के साथ पुनः कॉल करना चाहते हैं।

उपरोक्त कोड से आप देख सकते हैं कि यह अधिक गड़बड़ हो जाता है क्योंकि हम फ़ंक्शन को कई बार कॉल करना चाहते हैं।

चरण 3) अब देखते हैं कि जेनरेटर का उपयोग करके उसी कोड को कैसे लागू किया जाए। नीचे दिए गए कोड से अब आप देख सकते हैं कि जेनरेटर का उपयोग करके टाइमडिले फ़ंक्शन को लागू करना कितना सरल हो गया है।

कॉलबैक बनाम. Generators

function* Messages() {
  console,log(yield(Timedelay(1000, function(){})));
  console,log(yield(Timedelay(2000, function(){})));
  console,log(yield(Timedelay(3000, function(){})));
}

कोड स्पष्टीकरण

  1. हम सबसे पहले एक जेनरेटर फ़ंक्शन परिभाषित कर रहे हैं जिसका उपयोग हमारे टाइमडिले फ़ंक्शन को कॉल करने के लिए किया जाएगा।
  2. हम 1000 पैरामीटर मान के साथ टाइमडिले फ़ंक्शन के साथ यील्ड फ़ंक्शन को कॉल कर रहे हैं।
  3. फिर हम 2000 पैरामीटर मान के साथ टाइमडिले फ़ंक्शन के साथ यील्ड फ़ंक्शन को कॉल कर रहे हैं।
  4. अंत में, हम 3000 पैरामीटर मान के साथ Timedelay फ़ंक्शन के साथ Yield फ़ंक्शन को कॉल कर रहे हैं।

सारांश

Generators का उपयोग नेस्टेड कॉलबैक से संबंधित समस्याओं को कम करने के लिए भी किया जा सकता है, तथा कॉलबैक नरक के रूप में जानी जाने वाली समस्या को दूर करने में सहायता करता है। Generators का उपयोग किसी फ़ंक्शन की प्रोसेसिंग को रोकने के लिए किया जाता है। यह एसिंक्रोनस फ़ंक्शन में 'yield' विधि के उपयोग द्वारा पूरा किया जाता है।