जावास्क्रिप्ट में जनरेटर फंक्शन्स
इस लेख में, हम जावास्क्रिप्ट में जनरेटर फंक्शन्स को समझाएंगे।
YouTube Video
जावास्क्रिप्ट में जनरेटर फंक्शन्स
जावास्क्रिप्ट जनरेटर फंक्शन्स विशेष प्रकार के फंक्शन्स हैं जो सामान्य फंक्शन्स से भिन्न होते हैं क्योंकि वे स्थगित निष्पादन (लज़ी एक्ज़िक्यूशन) कर सकते हैं और रोकने और पुनः आरंभ करने की क्षमता रखते हैं। जनरेटर फंक्शन्स को समझकर, आप असिंक्रॉनस ऑपरेशन्स और बड़े डेटा के क्रमिक प्रसंस्करण को कुशलतापूर्वक प्रबंधित कर सकते हैं। यहां हम विस्तार से बताएंगे कि जनरेटर फंक्शन्स कैसे काम करते हैं, उनका उपयोग कैसे करें और उनके व्यावहारिक उपयोगों के बारे में।
जनरेटर फंक्शन्स क्या हैं?
एक जनरेटर फंक्शन function*
(एक तारा चिह्न के साथ फंक्शन परिभाषा) के साथ परिभाषित किया गया है, और सामान्य फंक्शन्स के विपरीत, यह अपने क्रियान्वयन को बीच में रोक सकता है और अपना स्टेट बनाए रखते हुए इसे फिर से शुरू कर सकता है। जनरेटर फंक्शन्स "लज़ी एक्ज़िक्यूशन" की अनुमति देते हैं और परिणामों को क्रमवार लौटाते हैं, जिससे प्रभावी मेमोरी प्रबंधन और क्रमिक प्रसंस्करण संभव होता है।
सिंटैक्स (वाक्य रचना)
1function* generatorFunction() {
2 yield 'First value';
3 yield 'Second value';
4 return 'Done';
5}
इस प्रकार, एक जनरेटर फंक्शन में कई yield
अभिव्यक्तियां हो सकती हैं और अपने निष्पादन को रोकने के लिए yield
का उपयोग कर सकता है। जब एक जनरेटर फंक्शन को कॉल किया जाता है, तो फंक्शन का बॉडी तुरंत निष्पादित नहीं होता है, और एक जनरेटर ऑब्जेक्ट लौटाया जाता है। आप इस ऑब्जेक्ट पर next()
मेथड को कॉल करके फंक्शन को उस बिंदु से पुनः आरंभ कर सकते हैं जहां इसे रोका गया था।
जनरेटर फंक्शन का मूल उपयोग
आइए, जनरेटर फंक्शन को उपयोग करने का एक सरल उदाहरण देखते हैं।
1function* simpleGenerator() {
2 yield 1;
3 yield 2;
4 yield 3;
5}
6
7const gen = simpleGenerator();
8
9console.log(gen.next()); // { value: 1, done: false }
10console.log(gen.next()); // { value: 2, done: false }
11console.log(gen.next()); // { value: 3, done: false }
12console.log(gen.next()); // { value: undefined, done: true }
यहां ध्यान देने का मुख्य बिंदु यह है कि जनरेटर प्रत्येक बार yield
के साथ मान लौटाता है, और जब तक done
प्रॉपर्टी false
है, यह दर्शाता है कि और मान आने बाकी हैं। next()
की अंतिम कॉल done: true
लौटाती है, जो संकेत करता है कि जनरेटर पूरा हो गया है।
yield
कीवर्ड और रोकने वाले मान
yield
एक कीवर्ड है जो जनरेटर फंक्शन के भीतर रुकने वाले बिंदु को इंगित करता है। yield
के दाईं ओर का मान next()
कॉल किए जाने पर लौटाया जाता है। साथ ही, yield
द्विदिश संचार (bi-directional communication) की अनुमति देता है। दूसरे शब्दों में, जब next()
मेथड को एक आर्ग्युमेंट के रूप में कोई मान पास किया जाता है, तो वह मान जनरेटर फंक्शन में भेजा जाता है।
1function* generatorWithYield() {
2 const value1 = yield 'First yield';
3 console.log('Received value:', value1);
4 const value2 = yield 'Second yield';
5 console.log('Received value:', value2);
6}
7
8const gen = generatorWithYield();
9
10console.log(gen.next()); // { value: 'First yield', done: false }
11console.log(gen.next('Apple')); // Received value: Apple
12 // { value: 'Second yield', done: false }
13console.log(gen.next('Banana'));// Received value: Banana
14 // { value: undefined, done: true }
इस उदाहरण में, next('Apple')
को कॉल करने पर मान 'Apple'
जनरेटर फंक्शन में भेजा जाता है, जहां इसे फंक्शन के भीतर उपयोग किया जाता है।
जनरेटर स्टेट का प्रबंधन
जनरेटर अपने निष्पादन स्टेट को बनाए रख सकते हैं, जो लंबे लूप्स या क्रमिक प्रसंस्करण के लिए संक्षिप्त प्रतिनिधित्व की अनुमति देता है। निम्न उदाहरण एक जनरेटर को दर्शाता है जो अनिश्चितकाल तक संख्याएँ उत्पन्न करता है।
1function* infiniteGenerator() {
2 let i = 0;
3 while (true) {
4 yield i++;
5 if (i > 10) {
6 break;
7 }
8 }
9}
10
11const gen = infiniteGenerator();
12
13console.log(gen.next().value); // 0
14console.log(gen.next().value); // 1
15console.log(gen.next().value); // 2
16// Continues...
यह जनरेटर while(true)
लूप का उपयोग करके संख्याएँ निरंतर उत्पन्न करता है, जिससे आपको आवश्यकता के अनुसार मान प्राप्त करने की अनुमति मिलती है। यह बड़े डेटा सेट के कुशल प्रसंस्करण को सक्षम बनाता है।
जनरेटर फ़ंक्शन्स के उपयोग
जनरेटर फ़ंक्शन्स कई प्रक्रियाओं को क्रमिक रूप से निष्पादित करने के लिए उपयुक्त हैं। उदाहरण के लिए, वे API अनुरोधों को क्रमिक रूप से संसाधित करने या बड़ी फाइलों को विभाजित और संसाधित करने में सहायक होते हैं।
1function* apiRequestGenerator() {
2 yield fetch('https://codesparklab.com/json/example1.json');
3 yield fetch('https://codesparklab.com/json/example2.json');
4 yield fetch('https://codesparklab.com/json/example3.json');
5}
इस प्रकार, जनरेटर जो असिंक्रोनस प्रसंस्करण के लिए उपयोग किए जा सकते हैं, कुशल क्रमिक डेटा प्रबंधन के लिए अत्यधिक लाभकारी हैं।
असिंक्रोनस जनरेटर
ES2018 में पेश किए गए असिंक्रोनस जनरेटर, async
और yield
को संयोजित करके क्रमिक रूप से असिंक्रोनस मान लौटाने की अनुमति देते हैं। यह await
के साथ संयोजन में असिंक्रोनस प्रसंस्करण को संक्षिप्त रूप से लिखना संभव बनाता है।
सिंटैक्स (वाक्य रचना)
1async function* asyncGenerator() {
2 yield await Promise.resolve(1);
3 yield await Promise.resolve(2);
4 yield await Promise.resolve(3);
5}
6
7const gen = asyncGenerator();
8
9(async () => {
10 for await (const value of gen) {
11 console.log(value); // 1, 2, 3
12 }
13})();
असिंक्रोनस जनरेटर for await...of
लूप का उपयोग करके मानों को क्रमिक रूप से पुनः प्राप्त कर सकते हैं। यह पैटर्न विशेष रूप से असिंक्रोनस डेटा स्ट्रीम को संभालते समय उपयोगी होता है।
व्यावहारिक उदाहरण: जनरेटर के साथ असिंक्रोनस प्रसंस्करण को सरल बनाना
जनरेटर फ़ंक्शन्स का उपयोग असिंक्रोनस प्रसंस्करण के प्रवाह को सरल बनाने के लिए भी किया जाता है। उदाहरण के लिए, नीचे दिखाए गए अनुसार yield
और Promise
को संयोजित करके, आप असिंक्रोनस संचालन को सिंक्रोनस जैसा दिखा सकते हैं।
1function* asyncFlow() {
2 const data1 = yield fetch('https://codesparklab.com/json/example1.json');
3 console.log(data1);
4 const data2 = yield fetch('https://codesparklab.com/json/example2.json');
5 console.log(data2);
6}
7
8const gen = asyncFlow();
9
10function handleAsync(generator) {
11 const next = (promise) => {
12 promise.then((result) => {
13 const { value, done } = generator.next(result);
14 if (!done) {
15 next(value);
16 }
17 });
18 };
19
20 next(generator.next().value);
21}
22
23handleAsync(gen);
यह कोड जनरेटर का उपयोग करके API अनुरोधों को क्रमिक रूप से कर रहा है और परिणामों को संसाधित कर रहा है।
सारांश
जनरेटर फ़ंक्शन्स जावास्क्रिप्ट की शक्तिशाली विशेषताओं में से एक हैं, जिनमें किसी फ़ंक्शन के निष्पादन को रोकने और पुनः आरंभ करने की क्षमता होती है। यह क्रमिक प्रसंस्करण, असिंक्रोनस प्रसंस्करण, और बड़े डेटा सेट के कुशल रूप से संचालन की अनुमति देता है। जनरेटर को समझना जावास्क्रिप्ट में उन्नत तकनीकों में निपुणता हासिल करने की दिशा में एक महत्वपूर्ण कदम है।
आप हमारे YouTube चैनल पर Visual Studio Code का उपयोग करके ऊपर दिए गए लेख के साथ आगे बढ़ सकते हैं। कृपया YouTube चैनल को भी देखें।