जनरेटर - साफ़-साफ़

ECMAScript 6 के ड्राफ़्ट स्पेसिफ़िकेशन से, आधुनिक JavaScript डेवलपर को पहले ही कई फ़ायदे मिल चुके हैं. हमने पिछली पोस्ट में, कुछ नई कलेक्शन क्लास और for..ofइटरेशन लूप के बारे में बताया था. इस पोस्ट में, हम for..of लूप के साथ काम करने वाले जनरेटर फ़ंक्शन के बारे में बात करेंगे.

इंटरनेट पर शानदार कॉन्टेंट मौजूद है, जिसमें जनरेटर का इस्तेमाल क्यों और कैसे करना है, इस बारे में बताया गया है. खास तौर पर, जनरेटर ऐसे खास फ़ंक्शन होते हैं जो इटरेटर्स बनाते हैं. साथ ही, इटरेटर्स ऐसे ऑब्जेक्ट होते हैं जिनमें next() मेथड होता है. वैल्यू पाने के लिए, इस मेथड को कॉल किया जा सकता है. जनरेटर फ़ंक्शन में, yield कीवर्ड next() की वैल्यू देता है. yield का इस्तेमाल करने पर, जनरेटर फ़ंक्शन का एक्ज़ीक्यूशन सस्पेंड हो जाता है. साथ ही, next() को फिर से कॉल किए जाने तक, स्टेटस को बनाए रखा जाता है. इसके बाद, कोड फिर से शुरू हो जाता है और तब तक चलता रहता है, जब तक कि वह yieldको कोई दूसरी वैल्यू नहीं देता या जनरेटर फ़ंक्शन बंद नहीं हो जाता. जनरेटर फ़ंक्शन के इस्तेमाल के कई कैननिकल उदाहरण हैं. जैसे, फ़िबोनाची क्रम में मौजूद संख्याओं को दोहराने के लिए उनका इस्तेमाल करना.

बुनियादी बातें जानने के बाद, आइए एक JavaScript सैंपल के बारे में ज़्यादा जानें. इसमें, जनरेटर के साथ काम करने से जुड़ी कुछ समस्याओं या “मुश्किल बातों” के बारे में बताया गया है. इसमें टिप्पणियां बहुत ज़्यादा हैं. साथ ही, कोड को पढ़ने से पहले, उसके लाइव वर्शन को आज़माया जा सकता है:

तो कोड से क्या खास बातें सीखी जा सकती हैं?

सबसे पहले, जनरेटर बनाने से एक यूनीक इटरेटर बनता है, जिसकी अपनी अलग स्थिति होती है. साथ ही, जनरेटर कन्स्ट्रक्टर में ऐसे पैरामीटर पास किए जा सकते हैं जो व्यवहार को कंट्रोल कर सकते हैं.

दूसरा, किसी आइटरर के next() तरीके को कॉल करते समय, कोई पैरामीटर पास किया जा सकता है. यह वैल्यू, आइटरर के पिछले कॉल से yield स्टेटमेंट की बाईं ओर मौजूद वैल्यू को असाइन कर दी जाएगी. यह, किसी फ़ंक्शन के आउटपुट में बदलाव करने का एक बेहतरीन तरीका है. यहां हम इसका इस्तेमाल यह कंट्रोल करने के लिए करते हैं कि फ़ंक्शन से मिला शब्द अपरकेस में है या नहीं. अगर आपको जनरेटर के कंस्ट्रक्टर में पैरामीटर की मदद से, जनरेट की गई पहली वैल्यू पर असर डालना है, तो ऐसा करें.

आखिर में, जनरेटर सीमित या अनलिमिटेड आइटरेटर बना सकते हैं. अगर अनलिमिटेड इटरेटर्स का इस्तेमाल किया जा रहा है, तो पक्का करें कि आपके पास yielded वैल्यू के आधार पर कोई टर्मिनल कंडीशन हो. अनलिमिटेड लूप लिखना बहुत आसान है, खास तौर पर जब इटरेशन के लिए for..of का इस्तेमाल किया जा रहा हो. अगर next() को कॉल करके, सीमित आइटरेटर का इस्तेमाल किया जा रहा है, तो दिखाए गए ऑब्जेक्ट की .done प्रॉपर्टी से पता चलता है कि आइटरेशन पूरा हो गया है या नहीं.

हमें उम्मीद है कि वेब पर उपलब्ध अन्य संसाधनों के साथ-साथ, यह सैंपल आपको पसंद आएगा. साथ ही, इससे आपको यह सोचने में मदद मिलेगी कि अपने कोड में जनरेटर का इस्तेमाल कैसे किया जा सकता है. Firefox के 31 और Chrome के 39 वर्शन से, जनरेटर नेटिव तौर पर काम करते हैं. Regenerator प्रोजेक्ट, अन्य ब्राउज़र के लिए जनरेटर की सुविधा देता है. साथ ही, Traceur का इस्तेमाल भी किया जा सकता है.

इस लेख की समीक्षा करने में मदद करने के लिए, Erik Arvidsson का धन्यवाद.