জাভাস্ক্রিপ্টের জেনারেটর ফাংশনগুলি

জাভাস্ক্রিপ্টের জেনারেটর ফাংশনগুলি

এই প্রবন্ধে, আমরা জাভাস্ক্রিপ্টের জেনারেটর ফাংশনগুলি ব্যাখ্যা করবো।

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 দ্বিমুখী যোগাযোগের অনুমতি দেয়। অন্য কথায়, যখন 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 Video