ES6-এ অ্যাসিনক্রোনাস কোড লেখা সহজ করার জন্য বেশ কিছু শক্তিশালী ফিচার যুক্ত করা হয়েছে। এর মধ্যে Promises, async/await, এবং Generator Functions বিশেষভাবে গুরুত্বপূর্ণ। এগুলোর মাধ্যমে আপনি অ্যাসিনক্রোনাস কোড আরও সহজে, কার্যকরভাবে এবং পরিচালনাযোগ্যভাবে লিখতে পারেন।
1. Promises
Promise এক ধরনের অবজেক্ট যা ভবিষ্যতে একটি মান (value) প্রদান করবে, এবং এটি সফলভাবে সম্পন্ন হলে (resolved) বা কোনো সমস্যা হলে (rejected) একটি ফলাফল ফেরত দেয়। এটি callback hell (অনেক নেস্টেড কলব্যাকের সমস্যা) থেকে রক্ষা পেতে সহায়তা করে এবং কোডকে আরও পরিষ্কার করে।
Promise এর মেথড:
then(): Promise সফলভাবে সম্পন্ন হলে কলব্যাক ফাংশন চালানো হয়।catch(): Promise যদি ব্যর্থ হয় (rejected), তাহলে এটি একটি এরর হ্যান্ডলার চালায়।finally(): Promise সম্পন্ন হলে (success বা failure যাই হোক) যেকোনো ক্লিনআপ অপারেশন চালাতে ব্যবহার করা হয়।
উদাহরণ:
const fetchData = new Promise((resolve, reject) => {
const success = true; // Test variable
if (success) {
resolve("Data fetched successfully!");
} else {
reject("Failed to fetch data.");
}
});
fetchData
.then((data) => {
console.log(data); // "Data fetched successfully!"
})
.catch((error) => {
console.log(error); // "Failed to fetch data."
})
.finally(() => {
console.log("Request completed."); // Always runs
});
এখানে, then() ব্যবহার করে সফল ফলাফল, catch() দিয়ে ব্যর্থ ফলাফল এবং finally() দিয়ে ক্লিনআপ অপারেশন সম্পাদিত হয়।
2. Async/Await
Async/Await ES6-এ অ্যাসিনক্রোনাস কোড লেখার আরো আধুনিক ও কার্যকর পদ্ধতি। এটি Promise এর উপর ভিত্তি করে কাজ করে, তবে এটি কোডকে আরো সিনক্রোনাস (যেমন সোজা কোডের মতো) দেখায়। async ফাংশনটি একটি Promise রিটার্ন করে এবং await একটি Promise এর রেজাল্ট পাওয়ার জন্য অপেক্ষা করে।
Async/Await এর সুবিধা:
- Readable কোড: Asynchronous কোড আরো সহজভাবে লেখা যায়।
- Error handling:
try/catchব্লকের মাধ্যমে সহজে এরর হ্যান্ডলিং করা যায়।
উদাহরণ:
// Async/Await Example
function fetchData() {
return new Promise((resolve) => {
setTimeout(() => {
resolve("Data fetched!");
}, 2000);
});
}
async function getData() {
try {
const data = await fetchData(); // wait until Promise is resolved
console.log(data); // "Data fetched!"
} catch (error) {
console.log("Error:", error);
}
}
getData();
এখানে, await এর মাধ্যমে fetchData() ফাংশনটির রেজাল্ট পাওয়ার জন্য আমরা অপেক্ষা করছি, এবং try/catch ব্লকের মধ্যে সহজে এরর হ্যান্ডলিং করা হয়েছে।
3. Promise.all() এবং Promise.race()
Promise.all() এবং Promise.race() দুইটি গুরুত্বপূর্ণ Promise কৌশল, যা একাধিক Promise এর সমন্বয়ে অ্যাসিনক্রোনাস কাজগুলো পরিচালনা করতে ব্যবহৃত হয়।
Promise.all():
Promise.all() একাধিক Promise গ্রহণ করে এবং তাদের সবগুলো সফলভাবে পূর্ণ হলে একটি একক Promise রিটার্ন করে। যদি কোনো একটি Promise ব্যর্থ হয়, তাহলে catch() হ্যান্ডলার কল হবে।
উদাহরণ:
const promise1 = new Promise((resolve) => setTimeout(resolve, 1000, "First"));
const promise2 = new Promise((resolve) => setTimeout(resolve, 2000, "Second"));
const promise3 = new Promise((resolve, reject) => setTimeout(reject, 1500, "Error"));
Promise.all([promise1, promise2, promise3])
.then((results) => {
console.log(results); // If all promises are resolved
})
.catch((error) => {
console.log(error); // "Error"
});
এখানে, যদি তৃতীয় Promise reject হয়, তাহলে Promise.all() catch() কল করবে এবং কোনরকম রেজাল্ট রিটার্ন করবে না।
Promise.race():
Promise.race() একাধিক Promise গ্রহণ করে, তবে এটি প্রথমে পূর্ণ হওয়া Promise এর রেজাল্ট ফেরত দেয়। একাধিক Promise একে অপরকে রেসে পরাজিত করে, এবং প্রথম যে Promise সফল হয়, তা ফেরত আসে।
উদাহরণ:
const promise1 = new Promise((resolve) => setTimeout(resolve, 2000, "First"));
const promise2 = new Promise((resolve) => setTimeout(resolve, 1000, "Second"));
Promise.race([promise1, promise2])
.then((result) => {
console.log(result); // "Second"
});
এখানে, promise2 ১ সেকেন্ডে রেজলভ হওয়ায় Promise.race() প্রথমেই তার রেজাল্ট (যা "Second") ফেরত দেয়।
4. Generator Functions এবং Async Iterators
ES6-এ Generator Functions এবং Async Iterators ব্যবহার করে আপনি আরও শক্তিশালী এবং কাস্টমাইজড অ্যাসিনক্রোনাস ফ্লো তৈরি করতে পারেন। Async Generators ফাংশনগুলি অ্যাসিনক্রোনাস ডেটা সরবরাহের জন্য বিশেষভাবে উপযোগী, যেখানে আপনি একাধিক yield এর মাধ্যমে ডেটা প্রক্রিয়া করতে পারেন এবং তার রেজাল্টটি অ্যাসিনক্রোনাসভাবে গ্রহণ করতে পারেন।
উদাহরণ:
async function* fetchData() {
yield await new Promise((resolve) => setTimeout(resolve, 1000, "Data 1"));
yield await new Promise((resolve) => setTimeout(resolve, 2000, "Data 2"));
yield await new Promise((resolve) => setTimeout(resolve, 3000, "Data 3"));
}
(async () => {
for await (let data of fetchData()) {
console.log(data); // "Data 1", "Data 2", "Data 3"
}
})();
এখানে, async generator function একে একে yield করে অ্যাসিনক্রোনাস ডেটা প্রদান করছে, এবং for await লুপের মাধ্যমে ডেটাগুলো ধীরে ধীরে পাওয়া যাচ্ছে।
সারাংশ
ES6-এ Async Control Flow ব্যবস্থাপনার জন্য কয়েকটি শক্তিশালী কৌশল রয়েছে, যার মধ্যে Promises, async/await, Promise.all(), Promise.race(), এবং Async Generators অন্যতম। এই ফিচারগুলো অ্যাসিনক্রোনাস কোড লেখাকে আরও সহজ, পরিষ্কার, এবং পরিচালনাযোগ্য করে তোলে, বিশেষ করে জটিল অ্যাসিনক্রোনাস ফ্লো তৈরি করার সময়। Async/Await কোডকে সিনক্রোনাস স্টাইলে লেখার সুযোগ দেয়, যা অ্যাসিনক্রোনাস কোডকে আরও সহজ এবং ডিবাগgable করে তোলে।
Read more