Generators ES6 (ECMAScript 2015) এ একটি নতুন ফিচার হিসেবে পরিচিতি পেয়েছে, যা asynchronous কোডের মতো সিঙ্ক্রোনাস কোডও সম্পাদন করতে সক্ষম। Generators এর মাধ্যমে আপনি ফাংশনগুলিকে "pause" এবং "resume" করতে পারেন, অর্থাৎ একাধিক সময়ে তাদের কার্যক্রম স্থগিত করতে এবং পরে পুনরায় চালিয়ে নিতে পারেন।
Generators একটি বিশেষ ধরনের ফাংশন, যা function* সিনট্যাক্স দিয়ে ডিফাইন করা হয় এবং yield কিওয়ার্ডের মাধ্যমে মান ফেরত দেয়। এটি একটি iterable (যেমন অ্যারে, স্ট্রিং, বা অবজেক্ট) থেকে পরপর মান বের করার জন্য ব্যবহৃত হয়, এবং প্রতি ধাপে yield দিয়ে মান প্রেরণ করে।
Generator Function ডিফাইন করা
একটি generator function তৈরি করার জন্য function* কিওয়ার্ড ব্যবহার করা হয়। এই ফাংশনগুলি yield কিওয়ার্ড ব্যবহার করে মান ফেরত দেয় এবং পরবর্তীতে সেই ফাংশনটি পুনরায় শুরু করতে পারে।
function* myGenerator() {
yield 1;
yield 2;
yield 3;
}
const generatorObj = myGenerator();
console.log(generatorObj.next()); // { value: 1, done: false }
console.log(generatorObj.next()); // { value: 2, done: false }
console.log(generatorObj.next()); // { value: 3, done: false }
console.log(generatorObj.next()); // { value: undefined, done: true }
এখানে, myGenerator একটি generator function, যা তিনটি মান (১, ২, ৩) yield করে। next() মেথড ব্যবহার করে আমরা পরবর্তী মানটি পেতে পারি। প্রথমবার next() কল করলে এটি 1 ফেরত দেয়, দ্বিতীয়বারে 2, তৃতীয়বারে 3, এবং শেষে done: true হয়ে ফাংশনটি শেষ হয়।
yield কিওয়ার্ড
yield কিওয়ার্ড একটি generator ফাংশনের execution কে pause করে দেয় এবং একটি মান ফেরত পাঠায়। পরবর্তী সময়ে next() কল করলে, ফাংশনটি সেই জায়গা থেকে পুনরায় শুরু হয়।
Example: yield কিওয়ার্ড ব্যবহার
function* countToFive() {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
}
const counter = countToFive();
console.log(counter.next().value); // 1
console.log(counter.next().value); // 2
console.log(counter.next().value); // 3
console.log(counter.next().value); // 4
console.log(counter.next().value); // 5
console.log(counter.next().value); // undefined
এখানে, countToFive ফাংশনটি yield কিওয়ার্ড ব্যবহার করে ১ থেকে ৫ পর্যন্ত মান প্রদান করে। প্রতি next() কলের পর, ফাংশনটি pause হয়ে যায় এবং পরবর্তী next() কলে আবার চলতে থাকে।
Generator Method
JavaScript এর class এও generator method ব্যবহার করা সম্ভব। এটি এমন একটি ফাংশন যা ক্লাসের ইনস্ট্যান্সের মধ্যে yield দিয়ে মান ফেরত দেয়।
Example: Generator in a Class
class MyClass {
*gen() {
yield "Hello";
yield "World";
}
}
const obj = new MyClass();
const generator = obj.gen();
console.log(generator.next().value); // "Hello"
console.log(generator.next().value); // "World"
console.log(generator.next().value); // undefined
এখানে, gen মেথডটি একটি generator method, যা দুইটি মান (Hello এবং World) yield করে।
Generator with Arguments
Generator ফাংশনগুলিতে আর্গুমেন্টও পাঠানো যেতে পারে। yield কিওয়ার্ডের মাধ্যমে আপনি আর্গুমেন্ট নিতে পারেন এবং তাদের সাথে কাজ করতে পারেন।
Example: Generator with Arguments
function* multiplyByFactor(factor) {
let num = 1;
while (true) {
yield num * factor;
num++;
}
}
const gen = multiplyByFactor(2);
console.log(gen.next().value); // 2
console.log(gen.next().value); // 4
console.log(gen.next().value); // 6
এখানে, multiplyByFactor একটি generator function, যা প্রতিবারে একটি নতুন মান ফেরত দেয় যা factor দ্বারা গুণ করা হয়।
Return Value
একটি generator ফাংশন যখন return ব্যবহার করে, তখন এটি কাজ শেষ হয়ে যায় এবং done: true হয়ে যায়।
function* myGenerator() {
yield 1;
yield 2;
return 3;
}
const gen = myGenerator();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: true }
console.log(gen.next()); // { value: undefined, done: true }
এখানে, return 3 ব্যবহার করা হলে, ফাংশনটি শেষ হয়ে যায় এবং done: true হয়ে যায়।
Generator Functions এর ব্যবহার
Generators ব্যবহার করা হয় এমন পরিস্থিতিতে যেখানে আপনি ডেটার বড় সিকোয়েন্সের সাথে কাজ করছেন এবং একে একে ডেটা প্রক্রিয়া করতে চান। এটি lazy evaluation এর মতো কাজ করে, অর্থাৎ ডেটা প্রয়োজন না হলে সেটা প্রক্রিয়া করা হয় না। যেমন:
- Asynchronous Programming: Promises এবং async/await এর সাথে Generator functions ব্যবহার করে asynchronous কাজগুলো আরও সহজভাবে পরিচালনা করা যায়।
- Iterables: যখন অনেক পরিমাণ ডেটার সাথে কাজ করা হয় এবং একে একে ডেটা বের করতে হয়।
সারাংশ
Generators ES6 এর একটি শক্তিশালী ফিচার, যা function* এবং yield কিওয়ার্ডের মাধ্যমে asynchronous এবং synchronous কাজগুলিকে পরিচালনা করতে সহায়ক। এর মাধ্যমে আপনি ফাংশনগুলোকে স্থগিত এবং পুনরায় চালু করতে পারেন, যা আপনাকে কোডের স্ট্রাকচার এবং পারফরম্যান্সে আরও উন্নতি করতে সাহায্য করে।
Generator Function ES6 (ECMAScript 2015) এ নতুন একটি ফিচার, যা function* সিনট্যাক্স দিয়ে ডিফাইন করা হয়। এটি একটি বিশেষ ধরনের ফাংশন যা একাধিক মান (values) ধারাবাহিকভাবে প্রদান করতে পারে এবং যখন প্রয়োজন হয়, তখন তার কার্যকারিতা পুনরায় শুরু করা যায়। সাধারণ ফাংশনের বিপরীতে, Generator ফাংশন এক্সিকিউশন স্টপ করে এবং পরে আবার চলতে থাকে, যা এর আউটপুট ব্যবস্থাপনা অনেক সহজ করে।
একটি Generator ফাংশন প্রাথমিকভাবে একটি generator object রিটার্ন করে, যা yield কিওয়ার্ড ব্যবহার করে একাধিক মান বা ভ্যালু প্রদান করতে সক্ষম।
Generator Function Sintax
একটি Generator Function ডিফাইন করতে function* সিনট্যাক্স ব্যবহার করা হয়। এখানে yield কিওয়ার্ড ব্যবহার করে ফাংশনটি বিভিন্ন মান (values) ফেরত দেয়।
function* myGenerator() {
yield 1;
yield 2;
yield 3;
}
এখানে, myGenerator একটি generator function, যা একে একে 1, 2, এবং 3 মান প্রদান করবে।
Generator Function এর ব্যবহার
Generator Function কে কল করা
Generator Function একটি generator object রিটার্ন করে, যেটি next() মেথডের মাধ্যমে মান বের করতে সক্ষম।
const gen = myGenerator(); // Generator object তৈরি করা
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { value: undefined, done: true }
next()মেথডটি generator থেকে পরবর্তী মান (value) ফেরত দেয়। এটি একটি অবজেক্ট রিটার্ন করে, যেটি দুটি প্রপার্টি ধারণ করে:value: পরবর্তী মান যা ফাংশন থেকে প্রদান করা হয়েছে।done: একটি বুলিয়ান মান যা জানায় যে, আরও কোনো মান প্রদান করা হবে কি না (যদিdone: trueহয়, তবে মান শেষ হয়ে গেছে)।
yield কিওয়ার্ড
yield কিওয়ার্ডটি Generator Function এর মধ্যে ব্যবহৃত হয় যা ফাংশনকে বিরতি দিয়ে একটি মান প্রদান করতে সক্ষম করে। প্রতিবার yield কল হলে, ফাংশনটি বিরতি নেয় এবং পরবর্তী বার next() কল করার মাধ্যমে তা পুনরায় শুরু হয়।
yield এর উদাহরণ
function* countUpTo(max) {
let count = 1;
while (count <= max) {
yield count;
count++;
}
}
const counter = countUpTo(3);
console.log(counter.next().value); // 1
console.log(counter.next().value); // 2
console.log(counter.next().value); // 3
console.log(counter.next().value); // undefined (done: true)
এখানে, countUpTo(3) generator function 1 থেকে 3 পর্যন্ত মান প্রদান করবে। প্রতিবার next() কল করার পর ফাংশনটি আবার চালু হবে এবং পরবর্তী মান প্রদান করবে।
Generator Function এর সুবিধা
- Lazy Evaluation (অলস মূল্যায়ন): Generator ফাংশন শুধুমাত্র যখন
next()কল করা হয় তখনই তার মান প্রদান করে, অর্থাৎ এটি শুধুমাত্র প্রয়োজনীয় সময়ে কাজ করে। এই কারণে এটি বড় বড় ডেটা সেট নিয়ে কাজ করার সময় মেমরি ব্যবস্থাপনায় সাহায্য করে। - State Retention (স্টেট রিটেনশন):
yieldব্যবহার করার মাধ্যমে ফাংশন তার অবস্থান (state) বজায় রেখে পরবর্তী কলের মাধ্যমে আবার কাজ চালিয়ে যেতে পারে। এটি stateful ফাংশন তৈরি করার ক্ষেত্রে খুবই উপকারী। - Asynchronous Programming (অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং): Generator ফাংশনগুলির মাধ্যমে আপনি অ্যাসিঙ্ক্রোনাস কাজগুলো সহজভাবে করতে পারেন, যেমন ফাইল পড়া, ডেটাবেসের সঙ্গে যোগাযোগ, বা HTTP কল করা।
Generator Function এর ব্যবহার অ্যাসিঙ্ক্রোনাস কোডে
Generator Function অ্যাসিঙ্ক্রোনাস কোডের মধ্যে ব্যবহৃত হলে, আপনি yield কিওয়ার্ডের মাধ্যমে পরবর্তী asynchronous কাজের জন্য অপেক্ষা করতে পারেন।
function* fetchData() {
const response = yield fetch('https://api.example.com/data');
const data = yield response.json();
console.log(data);
}
// Generator ফাংশন ব্যবহার করে অ্যাসিঙ্ক্রোনাস কোডের কার্যকরী উদাহরণ
const generator = fetchData();
const fetchPromise = generator.next().value; // First yield fetch API
fetchPromise.then(response => {
generator.next(response).value // Second yield for json response
}).then(data => {
generator.next(data); // Final step after data is fetched
});
এখানে, Generator ফাংশন yield কিওয়ার্ডের মাধ্যমে ডেটা অ্যাসিঙ্ক্রোনাসভাবে নেয় এবং পরে তা প্রক্রিয়া করে।
সারাংশ
Generator ফাংশন এবং yield কিওয়ার্ড JavaScript কোডকে আরো কার্যকর এবং সুবিন্যস্ত করে তোলে, বিশেষ করে যখন আপনি বড় ডেটা সেট বা অ্যাসিঙ্ক্রোনাস কোডের সাথে কাজ করছেন। Generator ফাংশনগুলি lazy evaluation এবং state retention সুবিধা প্রদান করে, যা তাদের অত্যন্ত শক্তিশালী এবং ব্যবহারিক করে তোলে।
ES6 (ECMAScript 2015) function* এবং yield ব্যবহার করার মাধ্যমে generator functions তৈরি করা সম্ভব হয়েছে। এটি অ্যাসিঙ্ক্রোনাস কোড লেখা আরও সহজ এবং কার্যকরী করে তোলে। Generator functions এমন ফাংশন, যা execution এর মাঝে এক বা একাধিক বার বিরতি নিতে পারে এবং পরে পুনরায় চালু হতে পারে।
Generator Function কি?
Generator function এমন একটি ফাংশন, যা function* সিনট্যাক্স দিয়ে ডিফাইন করা হয় এবং তা yield কিওয়ার্ডের মাধ্যমে এক বা একাধিক মান ফেরত দেয়। এই ফাংশনটি lazy evaluation পদ্ধতিতে কাজ করে, অর্থাৎ যখন প্রয়োজন হয় তখনই পরবর্তী মানটি প্রদান করে।
function সিনট্যাক্স*
function* generatorFunction() {
// Yield statement
}
function*: এটি একটি generator function ডিফাইন করার জন্য ব্যবহৃত হয়।yield: এটি generator function এর execution কে paused করে এবং নির্দিষ্ট মানটি return করে। পরে, পুনরায় function call করার মাধ্যমে execution পুনরায় শুরু হয়।
yield কিওয়ার্ডের ব্যবহার
yield কিওয়ার্ডের মাধ্যমে generator function execution কে স্থগিত করা হয় এবং তার পরবর্তী মানটি next() মেথডের মাধ্যমে পুনরায় চলতে শুরু হয়। yield এর মাধ্যমে ফাংশন বিভিন্ন মান একটি এক করে রিটার্ন করতে পারে। প্রতিটি yield নতুন value ফাংশন থেকে বের করে আনে।
yield এর মৌলিক ব্যবহার:
function* numbers() {
yield 1;
yield 2;
yield 3;
}
const gen = numbers();
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3
এখানে, numbers() একটি generator function যা yield ব্যবহার করে তিনটি মান 1, 2, 3 return করে। প্রতিটি next() কলের মাধ্যমে yield দ্বারা ফাংশন পরবর্তী মানটি প্রদান করে।
Generator Function এর Working (Execution Flow)
Generator function এর execution সাধারণভাবে একবারে শুরু হয়ে শেষ হয় না, বরং এটি paused অবস্থায় থাকে যতক্ষণ না next() মেথড কল করা হয়। এটি stateful (অবস্থাপনা করা) হয়, কারণ একাধিকবার next() কল করে তা পুনরায় চালু করা সম্ভব।
next() মেথড
next() মেথডটি একটি generator function কে চলমান অবস্থায় নিয়ে আসে এবং পরবর্তী yield এর মান প্রদান করে। এটি একটি object রিটার্ন করে যার মধ্যে দুটি প্রপার্টি থাকে:
value: return হওয়া মানdone: একটি Boolean মান যা জানায় যে, ফাংশনটি শেষ হয়েছে কি না
function* generateNumbers() {
yield 10;
yield 20;
yield 30;
}
const generator = generateNumbers();
console.log(generator.next()); // { value: 10, done: false }
console.log(generator.next()); // { value: 20, done: false }
console.log(generator.next()); // { value: 30, done: false }
console.log(generator.next()); // { value: undefined, done: true }
এখানে, next() মেথডটি মান প্রদান করে এবং done: true যখন সব মান শেষ হয়ে যায়।
Generator Function এর সুবিধা
- Lazy Evaluation:
- Generator function গুলি lazy হিসেবে কাজ করে, অর্থাৎ তারা প্রয়োজন অনুযায়ী মান প্রদান করে। এতে কম পরিমাণ রিসোর্স ব্যবহার হয় এবং দ্রুত সম্পন্ন হয়।
- Asynchronous Programming:
- Generator function কে অ্যাসিঙ্ক্রোনাস কাজের জন্য ব্যবহার করা যায়, যেমন async/await এর আগেই একটি পদ্ধতি হিসেবে।
- Stateful Iteration:
- একাধিক মানে ইটারেট করতে generator function গুলি অবস্থা রাখতে পারে (stateful) এবং পুনরায় একে একে মান প্রদান করতে পারে।
Generator Function এবং yield এর উদাহরণ
অ্যাসিঙ্ক্রোনাস ফ্লো কন্ট্রোল:
function* fetchData() {
console.log("Fetching data...");
yield "Data 1";
yield "Data 2";
yield "Data 3";
}
const dataGenerator = fetchData();
console.log(dataGenerator.next().value); // Fetching data... Data 1
console.log(dataGenerator.next().value); // Data 2
console.log(dataGenerator.next().value); // Data 3
এখানে, fetchData একটি generator function যা একে একে বিভিন্ন ডেটা ফেচ করে এবং প্রতিটি yield পরবর্তী ডেটার জন্য ফাংশন কে বিরতি দেয়।
নির্দিষ্ট সময় পর পর মান প্রদান করা:
function* counter() {
let i = 1;
while (true) {
yield i++;
}
}
const count = counter();
console.log(count.next().value); // 1
console.log(count.next().value); // 2
console.log(count.next().value); // 3
এখানে, counter একটি infinite generator function, যা একের পর এক পরবর্তী সংখ্যার জন্য yield ব্যবহার করছে।
সারাংশ
function* এবং yield ES6 এর শক্তিশালী ফিচার, যা Generator functions তৈরি করতে ব্যবহৃত হয়। এগুলি অ্যাসিঙ্ক্রোনাস কোডের জন্য কার্যকর, যেখানে স্টেটফুল ডেটা প্রক্রিয়া প্রয়োজন। yield কিওয়ার্ড দিয়ে কোডের execution কে বিরতি দেওয়া হয় এবং পরবর্তী সময়ে তা পুনরায় চালু করা যায়।
ES6-এ Generator Functions এবং Iterators নতুন ধারণা হিসেবে পরিচিত হয়েছে। এগুলি অ্যাসিনক্রোনাস কোড, বড় ডেটা সেট এবং ক্রমাগত ডেটা প্রবাহের ক্ষেত্রে বিশেষভাবে উপকারী। Generator Functions এবং Iterators এর মাধ্যমে আপনি আরও কার্যকরীভাবে কোড পরিচালনা করতে পারেন, যেখানে lazy evaluation এবং stateful iteration করা সম্ভব।
1. Generator Functions
Generator Functions হল এমন ফাংশন যা একটি iterator রিটার্ন করে। এদের সাহায্যে আপনি ফাংশনের execution সময়কে বিরতি দিতে (pause) এবং পরে পুনরায় চালু করতে পারেন। এরা function* কিওয়ার্ড দিয়ে ডিফাইন করা হয় এবং yield কিওয়ার্ড ব্যবহার করে মান রিটার্ন করা হয়।
Generator Function এর বৈশিষ্ট্য:
function*কিওয়ার্ড ব্যবহার করে জেনারেটর ফাংশন ঘোষণা করা হয়।yieldকিওয়ার্ড ব্যবহার করে ফাংশন থেকে মান ফেরত দেওয়া হয় এবং ফাংশনের execution সেখানে থেমে যায়।- ফাংশন পুনরায় কল করলে execution আবার থেকে শুরু হয় যেখানে আগের
yieldথেমেছিল।
উদাহরণ:
function* countUpTo(max) {
let count = 1;
while (count <= max) {
yield count; // Return the current count and pause
count++;
}
}
const counter = countUpTo(5);
console.log(counter.next().value); // 1
console.log(counter.next().value); // 2
console.log(counter.next().value); // 3
console.log(counter.next().value); // 4
console.log(counter.next().value); // 5
console.log(counter.next().value); // undefined (iteration is complete)
এখানে, countUpTo একটি generator function যা 1 থেকে 5 পর্যন্ত সংখ্যাগুলো yield করে ফেরত দেয়। প্রতিটি next() কলের মাধ্যমে পরবর্তী মানটি পাওয়া যায়।
2. Iterators
Iterators হল এমন অবজেক্ট যা কোন ডেটা সংগ্রহের (যেমন অ্যারে, অবজেক্ট) উপাদান একে একে পরিদর্শন করতে সক্ষম। Generator functions সাধারণত একটি iterator রিটার্ন করে।
Iterators দুটি মেথডে কাজ করে:
next(): পরবর্তী মান ফেরত দেয় এবং সাথে একটি done প্রোপার্টি দিয়ে জানায় যে iteration শেষ হয়েছে কিনা।Symbol.iterator: এটি একটি অবজেক্টের জন্য iterator তৈরি করার জন্য ব্যবহৃত হয়।
উদাহরণ:
// Array iterator
const numbers = [1, 2, 3];
const iterator = numbers[Symbol.iterator]();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
এখানে, numbers[Symbol.iterator]() এর মাধ্যমে একটি iterator তৈরি করা হয়েছে। তারপর next() মেথড কল করা হয়েছে যা মান এবং iteration status প্রদান করেছে।
3. Generator Functions এবং Iterators এর মধ্যে সম্পর্ক
- Generator functions হলো একটি বিশেষ ধরনের ফাংশন যা iterator রিটার্ন করে এবং
yieldকিওয়ার্ড ব্যবহার করে মান ফিরিয়ে দেয়। - Iterators এমন অবজেক্ট যা
next()মেথডের মাধ্যমে ধারাবাহিকভাবে মান প্রদান করে, এবং iteration শেষ হলেdoneপ্রোপার্টি true হয়ে যায়।
4. Generator Functions এবং Iterators এর ব্যবহার
Generator functions এবং iterators অনেক ধরণের অ্যাসিনক্রোনাস অপারেশন, বড় ডেটা সেক্টরের ডেটা প্রসেসিং, এবং কোডের কার্যকারিতা বাড়াতে ব্যবহৃত হতে পারে। উদাহরণস্বরূপ, আপনি যদি কোনো বড় ডেটাবেস থেকে ডেটা বের করতে চান, তবে আপনি জেনারেটর ফাংশন ব্যবহার করে ডেটার টুকরো টুকরো করে সেগুলো প্রসেস করতে পারেন।
উদাহরণ:
function* fetchData() {
yield fetch('https://jsonplaceholder.typicode.com/posts/1').then(res => res.json());
yield fetch('https://jsonplaceholder.typicode.com/posts/2').then(res => res.json());
yield fetch('https://jsonplaceholder.typicode.com/posts/3').then(res => res.json());
}
const dataIterator = fetchData();
dataIterator.next().value.then(data => console.log(data)); // First fetch result
dataIterator.next().value.then(data => console.log(data)); // Second fetch result
dataIterator.next().value.then(data => console.log(data)); // Third fetch result
এখানে, প্রতিটি yield Promise রিটার্ন করে, এবং next() কলের মাধ্যমে পরবর্তী fetch অপারেশন শুরু হয়।
5. Benefits of Generator Functions and Iterators
- Lazy Evaluation: Generator functions এক সময় একটিই মান প্রদান করে এবং পরবর্তী মানের জন্য
next()কল করার মাধ্যমে তা পরবর্তীতে লোড হয়। এটি অনেক বেশি memory-efficient, বিশেষ করে যখন বড় ডেটা সেট প্রক্রিয়া করতে হয়। - Stateful Iteration: Generator functions ব্যবহারের মাধ্যমে আপনি একটি স্টেটফুল iterator তৈরি করতে পারেন যা অতিরিক্ত কম্পিউটেশনাল শক্তি ছাড়া সেগুলির উপর কাজ করতে সক্ষম।
- Asynchronous Flow Control: Generator functions অ্যাসিনক্রোনাস কোড পরিচালনা করতে সাহায্য করে, বিশেষ করে Promise এর সাথে একত্রে ব্যবহারে।
সারাংশ
Generator Functions এবং Iterators ES6-এ নতুনভাবে যুক্ত হওয়া শক্তিশালী টুলস, যেগুলি আপনাকে কোডের flow আরও উন্নতভাবে নিয়ন্ত্রণ করতে সহায়তা করে। এগুলি অ্যাসিনক্রোনাস অপারেশন, বড় ডেটা সেক্টর এবং কার্যকরী ডেটা প্রসেসিংয়ের ক্ষেত্রে খুবই উপকারী। Generator Functions বিশেষভাবে ব্যবহারকারীকে lazy evaluation এবং stateful iteration সুবিধা দেয়, যা অ্যাসিনক্রোনাস কোড আরও দক্ষতার সাথে পরিচালনা করতে সহায়তা করে।
Generators ES6 এ যোগ করা একটি শক্তিশালী ফিচার, যা asynchronous programming-এ কাজ করতে অনেক সুবিধা প্রদান করে। Generators এবং Asynchronous Programming এর মধ্যে বেশ কিছু সম্পর্ক রয়েছে, এবং Generator Functions ব্যবহার করে asynchronous কোড লিখা অনেক সহজ হয়।
এই টিউটোরিয়ালে আমরা Generators এবং Asynchronous Programming এর সংক্ষিপ্ত ধারণা এবং তাদের ব্যবহার সম্পর্কে বিস্তারিত আলোচনা করব।
Generators
Generator Functions হল বিশেষ ধরনের ফাংশন, যা yield কিওয়ার্ড ব্যবহার করে একটি ভ্যালু রিটার্ন করতে পারে। Generator ফাংশন থেকে একটি Iterator তৈরি হয়, যেটি একাধিক স্টেপে ভ্যালু প্রদান করতে পারে।
Generator Function এর সিনট্যাক্স:
function* myGenerator() {
yield 1;
yield 2;
yield 3;
}
এখানে, function* দিয়ে আমরা Generator Function তৈরি করি, এবং yield কিওয়ার্ড দ্বারা একটি ভ্যালু রিটার্ন করি। yield কিওয়ার্ড ব্যবহার করে ফাংশন execution এর মধ্য দিয়ে বারবার একটি ভ্যালু return করা হয়, এবং function execution আবার শুরু হয় যেখানে yield কিওয়ার্ড থেমেছিল।
Generator Function ব্যবহার করার উদাহরণ:
function* numbers() {
yield 1;
yield 2;
yield 3;
}
const numGen = numbers();
console.log(numGen.next()); // { value: 1, done: false }
console.log(numGen.next()); // { value: 2, done: false }
console.log(numGen.next()); // { value: 3, done: false }
console.log(numGen.next()); // { value: undefined, done: true }
এখানে, next() মেথডের মাধ্যমে Generator এর পরবর্তী ভ্যালু বের করা হয়। যখন আর কোনো yield পয়েন্ট না থাকে, তখন এটি done: true রিটার্ন করে।
Generators এবং Asynchronous Programming
Generators মূলত synchronous কোডের মধ্যে asynchronous কাজ করার জন্য খুবই শক্তিশালী একটি টুল। Async/Await এর আগেও Generators এর মাধ্যমে asynchronous কাজগুলো খুবই কার্যকরভাবে করা হত। আমরা yield কিওয়ার্ড ব্যবহার করে asynchronous অপারেশনগুলো step-by-step কার্যকর করতে পারি।
Async-Await এর আগে Generators ব্যবহার করে Asynchronous Programming
কিছু নির্দিষ্ট পরিস্থিতিতে, Generators ব্যবহার করে asynchronous operations যেমন API কল বা ফাইল রিডিং ইত্যাদি করা যায়, যা আমাদের asynchronous কোড লিখতে সাহায্য করে।
Generator এর মাধ্যমে Async Code লেখা:
function* fetchData() {
const data1 = yield fetch("https://jsonplaceholder.typicode.com/posts/1").then(res => res.json());
console.log(data1);
const data2 = yield fetch("https://jsonplaceholder.typicode.com/posts/2").then(res => res.json());
console.log(data2);
}
function run(generator) {
const iterator = generator();
function handleResult(result) {
if (result.done) return;
result.value.then(res => handleResult(iterator.next(res)))
.catch(err => iterator.throw(err));
}
handleResult(iterator.next());
}
run(fetchData);
এখানে, fetchData Generator function ব্যবহার করে দুটি fetch কল করার মাধ্যমে asynchronous কোড লেখা হয়েছে।
yieldকিওয়ার্ড ব্যবহার করে প্রতিটি asynchronous অপারেশন থেকে রিটার্ন হওয়া Promise এর রেজাল্ট পাওয়া যায়।run()ফাংশনটি একটি Iterator ব্যবহার করে প্রতিটি yield এর রিটার্ন মান অ্যাক্সেস করে।
Generators এবং Async-Await এর তুলনা
- Async-Await অনেক বেশি পরিষ্কার এবং সহজ বোঝা যায়, কারণ এটি Promises এর সাথে একত্রে কাজ করে।
- Generators asynchronous কোডের ধাপে ধাপে Execution নিয়ন্ত্রণ করতে সাহায্য করে। কিন্তু Async-Await সাধারণত বেশি জনপ্রিয় এবং ব্যবহার করা হয়।
- Generators খুবই শক্তিশালী, তবে তাদের সাথে কাজ করা কিছুটা জটিল হতে পারে।
Generators এর সুবিধা এবং ব্যবহার
- Lazy Evaluation: Generator function এর মধ্যে যেকোনো সময় execution থামিয়ে এবং আবার চালানো যায়, যা অত্যন্ত গুরুত্বপূর্ণ যখন অনেক বড় ডেটা স্ট্রিম বা লাইভ ডেটা নিয়ে কাজ করতে হয়।
- State Management: Generators আপনি বিভিন্ন স্টেটের মধ্যে পরিবর্তন করতে পারবেন। আপনি যখন একটি
yieldদিয়ে কোড থামাবেন, তখন তার পূর্ববর্তী স্টেট রাখা হয় এবং পরবর্তী সময়ে কোড আবার চালু করা যায়। - Async Workflow: Asynchronous কোড চেইন করতে
yieldব্যবহার করে স্টেপ বাই স্টেপ execution করতে পারবেন। এটি Promise chaining এর তুলনায় আরও ইফেকটিভ হতে পারে নির্দিষ্ট পরিস্থিতিতে।
সারাংশ
- Generators JavaScript এ একাধিক asynchronous বা synchronous কাজ করার জন্য খুবই শক্তিশালী টুল।
- Generator Functions এর মাধ্যমে আপনি একটি Iterator তৈরি করতে পারেন, যেটি yield কিওয়ার্ড ব্যবহার করে ভ্যালু রিটার্ন করতে পারে।
- Asynchronous Programming এ Generators দিয়ে কোড সহজভাবে লেখার প্রক্রিয়া এবং Async-Await এর আগে তা কার্যকর ছিল।
- বর্তমান সময়ে Async-Await পদ্ধতি সবচেয়ে বেশি ব্যবহৃত, তবে Generators এখনও complex asynchronous কাজগুলোকে কার্যকরভাবে পরিচালনা করতে ব্যবহৃত হয়।
Read more