जेनरेटर जावास्क्रिप्ट में सबसे शक्तिशाली कार्यात्मकताओं में से एक है, जो हमें कोड लिखने की अनुमति देता है जिसे आवश्यकतानुसार रोका और फिर से शुरू किया जा सकता है। सभी कोड को एक साथ निष्पादित करने वाले नियमित कार्यों के विपरीत, जनरेटर आलसी निष्पादन का उपयोग करते हैं, मूल्यों को क्रमिक रूप से लौटाते हैं, जिससे डेटा अनुक्रमों, पुनरावृत्तियों या लंबे समय तक चलने वाली प्रक्रियाओं के साथ काम करना आसान हो जाता है।
जावास्क्रिप्ट में, जेनरेटर को function* कीवर्ड का उपयोग करके परिभाषित किया जाता है, और यील्ड कीवर्ड के साथ मिलकर, किसी फ़ंक्शन को भागों में निष्पादित करने की अनुमति देता है। हर बार जब हम जनरेटर फ़ंक्शन को कॉल करते हैं, तो यह तुरंत निष्पादित नहीं होता है, लेकिन एक पुनरावर्तक लौटाता है जो नियंत्रित निष्पादन की अनुमति देता है।
उदाहरण:
const id = (function* () { let i = 1; while (true) { yield i; i = 1; } })();
इस उदाहरण में, फ़ंक्शन जनरेटर संख्याओं का एक अनंत अनुक्रम लौटाता है, जहां प्रत्येक संख्या उत्पन्न होती है और केवल जरूरत पड़ने पर ही लौटाई जाती है।
यील्ड कीवर्ड जनरेटर के निष्पादन को रोक देता है और बाहरी दुनिया को मान लौटाता है। अगले फ़ंक्शन कॉल पर (अगले() का उपयोग करके), जनरेटर वहीं जारी रहता है जहां उसने छोड़ा था।
जेनरेटर को कॉल करना कैसा दिखता है:
console.log(id.next().value); // 1 console.log(id.next().value); // 2 console.log(id.next().value); // 3
अगली() पर प्रत्येक कॉल सरणी का अगला मान लौटाती है और अगली उपज पर फ़ंक्शन को रोक देती है।
आलस्य:
जेनरेटर एक ही बार में सब कुछ निष्पादित नहीं करते हैं, बल्कि आवश्यकता पड़ने पर ही मूल्य उत्पन्न करते हैं। यह अनंत अनुक्रमों या डेटा के बड़े सरणियों के साथ काम करने के लिए आदर्श है।
प्रवाह नियंत्रण:
फ़ंक्शन को रोकने और फिर से शुरू करने की संभावना लंबे समय से चल रही प्रक्रियाओं के बेहतर नियंत्रण की अनुमति देती है।
क्षमता:
सभी मानों को मेमोरी में संग्रहीत करने के बजाय, जनरेटर एक समय में एक लौटाते हैं, जिससे मेमोरी की खपत कम हो जाती है।
हालांकि जनरेटर उपयोगी हैं, उनमें कई संभावित समस्याएं हैं:
जटिल प्रवाह नियंत्रण:
रोकने और फिर से शुरू करने से कोड को समझना और डीबग करना कठिन हो सकता है, खासकर जटिल परिदृश्यों में।
प्रदर्शन:
कुछ मामलों में, कोड को रोकने और फिर से शुरू करने से अतिरिक्त ओवरहेड हो सकता है, जिससे दक्षता कम हो सकती है।
सीमित:
प्रति कॉल एक मान लौटाया जाता है, जो एक बार में बहुत सारे डेटा तक पहुंचने की आवश्यकता होने पर अक्षम हो सकता है।
संगतता:
जेनरेटर ईसीएमएस्क्रिप्ट 2015 (ईएस6) मानक का हिस्सा हैं, इसलिए पुराने ब्राउज़र बेबेल जैसे अतिरिक्त टूल के बिना उनका समर्थन नहीं कर सकते हैं।
यदि जनरेटर बहुत अधिक जटिलता पेश करते हैं, तो आप विकल्पों पर विचार कर सकते हैं:
कॉलबैक के साथ पुनरावर्ती कार्य:
function generateID(callback, start = 1) { callback(start); setTimeout(() => generateID(callback, start 1), 0); }
फायदे:
आसान प्रवाह नियंत्रण: यद्यपि यह रिकर्सन का उपयोग करता है, प्रोग्राम के प्रवाह को नियंत्रित करने के मामले में फ़ंक्शन अधिक पठनीय और स्पष्ट है।
अतुल्यकालिक निष्पादन: सेटटाइमआउट का उपयोग अतुल्यकालिक संचालन को सक्षम बनाता है, जो प्रदर्शन को बनाए रखने में मदद करता है।
नुकसान:
रिकर्सन ओवरहेड: बहुत बड़ी संख्या में पुनरावृत्तियों के लिए, रिकर्सन समस्याएं (स्टैक ओवरफ्लो) हो सकती हैं।
लूप्स:
सरल लूप जो पूर्व निर्धारित संख्या में मान उत्पन्न करते हैं, छोटे सरणियों के लिए अधिक कुशल विकल्प हो सकते हैं।
function generateIDs(limit) { const ids = []; for (let i = 1; i
फायदे:
सरल कार्यान्वयन: इस समाधान को समझना आसान है और प्रवाह नियंत्रण में कोई समस्या नहीं है।
तेज़ पीढ़ी: सभी मान एक ही बार में उत्पन्न होते हैं, जो कम पुनरावृत्तियों के लिए अधिक कुशल हो सकते हैं।
नुकसान:
मेमोरी खपत: सभी मान मेमोरी में संग्रहीत होते हैं, जो बड़े सरणियों के लिए समस्याग्रस्त हो सकते हैं।
कोई आलस्य नहीं: सभी आईडी पूर्व-निर्मित हैं, जो कि यदि आपको उन सभी की आवश्यकता नहीं है तो अक्षम हो सकती है।
इटरेटर्स:
ऑब्जेक्ट जो जनरेटर के समान, लेकिन अधिक नियंत्रण के साथ .next() विधि के माध्यम से पुनरावृत्त मान लौटाते हैं।
function createIDIterator() { let i = 1; return { next() { return { value: i , done: false }; } }; } const idIterator = createIDIterator(); console.log(idIterator.next().value); // 1 console.log(idIterator.next().value); // 2 console.log(idIterator.next().value); // 3
फायदे:
प्रवाह नियंत्रण: जनरेटर के समान कार्यक्षमता है, लेकिन निष्पादन अधिक रैखिक है।
सरल कोड: कोई यील्ड नहीं, जिससे कोड का पालन करना आसान हो सकता है।
नुकसान:
कोई स्वचालित विराम नहीं: आपको पुनरावृत्तियों को मैन्युअल रूप से प्रबंधित करना होगा, जो कुछ मामलों में असुविधाजनक हो सकता है।
एसिंक/प्रतीक्षा के साथ अतुल्यकालिक पीढ़ी
यदि आईडी एसिंक्रोनस रूप से उत्पन्न होती हैं, तो आप एक फ़ंक्शन के साथ एसिंक/वेट का उपयोग कर सकते हैं जो वादे लौटाता है।
async function generateID(start = 1) { let i = start; while (true) { await new Promise((resolve) => setTimeout(resolve, 0)); console.log(i ); } } generateID();
फायदे:
अतुल्यकालिक निष्पादन: निष्पादन के मुख्य प्रवाह को अवरुद्ध किए बिना लंबे समय तक चलने वाले संचालन का कुशल संचालन।
आधुनिक सिंटैक्स: एसिंक/वेट एसिंक्रोनस कोड के साथ काम करने का एक अधिक आधुनिक और सहज तरीका है।
नुकसान:
सिंक्रोनस कोड के लिए उपयुक्त नहीं: यदि आपको सिंक्रोनस जेनरेशन की आवश्यकता है, तो यह समाधान आदर्श नहीं है।
जनरेटर डेटा के बड़े और अनंत सरणियों के साथ काम करने के साथ-साथ उन अनुप्रयोगों में प्रवाह नियंत्रण के लिए एक महान उपकरण है जिनके लिए प्रक्रियाओं को रोकने और फिर से शुरू करने की आवश्यकता होती है। हालाँकि, उनकी जटिलता और संभावित प्रदर्शन मुद्दों का मतलब है कि उनका उपयोग सावधानी से किया जाना चाहिए। अनुप्रयोग की आवश्यकताओं के आधार पर वैकल्पिक समाधान जैसे पुनरावृत्ति, पुनरावर्तन, या अतुल्यकालिक कोड अधिक उपयुक्त हो सकते हैं।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3