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 কাজগুলোকে কার্যকরভাবে পরিচালনা করতে ব্যবহৃত হয়।