Q23. What is async/await and how does it improve upon Promises?
Promise লিখার সিনক্রোনাস মতো স্টাইল, error handle করা আর সমান্তরাল কাজের সঠিক পদ্ধতি।
async/await হলো ES2017-এ আসা সুন্দর syntax — মূল কাজটা এখনো Promise, কিন্তু লেখা হয় সাধারণ সিনক্রোনাস কোডের মতো। async ফাংশন সবসময় একটি Promise ফেরত দেয়, আর await ফলাফল আসা পর্যন্ত ওই ফাংশনকে থামিয়ে রাখে।
// Promise — চেইন দিয়ে
function getUser() {
return fetch("/api/user")
.then(function (res) { return res.json(); })
.then(function (user) { return user.name; });
}
// async/await — সরাসরি
async function getUser() {
const res = await fetch("/api/user");
const user = await res.json();
return user.name;
}মূল সুবিধা হলো কোড সাধারণ লাইনে লাইনে পড়া যায় — লজিক থাকে সাধারণ, ফলাফল পাওয়ার জায়গায় শুধু await লেখা হয়।
Error handle করা আরও সহজ — try...catch ব্যবহার করলেই হয়, আলাদা করে .catch() চেইন করার দরকার নেই।
async function load() {
try {
const res = await fetch("/api/user");
if (!res.ok) throw new Error("সার্ভার ত্রুটি");
return await res.json();
} catch (error) {
console.error(error.message);
return null;
} finally {
console.log("সবসময় চলে");
}
}একটি জিনিস খেয়াল রাখা জরুরি — await কোডকে সময়মতো থামায়, কিন্তু পুরো JavaScript থামায় না। ব্রাউজারের অন্য কাজ চলতে থাকে, শুধু ওই ফাংশনটির পরের লাইন অপেক্ষায় থাকে।
দুটি কাজ একে অন্যের জন্য অপেক্ষা না করে একসাথে চালাতে Promise.all-এর ভিতরে await ব্যবহার করুন।
// ভুল — দ্বিতীয় কাজ প্রথমটার জন্য অপেক্ষা করছে
const user = await getUser();
const posts = await getPosts(); // অপেক্ষা করছে
// ভালো — দুটো একসঙ্গে শুরু হচ্ছে
const [user, posts] = await Promise.all([
getUser(),
getPosts(),
]);টপ-লেভেল await ES module-এ সরাসরি ব্যবহার করা যায়, তবে সাধারণ function-এর ভিতরে নয়।
// app.js — module হলে কাজ করে
const config = await fetch("/config").then(function (r) {
return r.json();
});| বিষয় | async/await | Promise chain |
|---|---|---|
| পড়ার সহজতা | সাধারণ কোডের মতো | .then() চেইন |
| Error handle | try...catch | .catch() |
| ফলাফল পাওয়া | await দিয়ে সরাসরি | .then() দিয়ে |
| সবসময় Promise | হ্যাঁ | — |
await শুধু async ফাংশনের ভিতরে কাজ করে, আর for...of বা for লুপের ভিতরে লিখলে ধাপে ধাপে অপেক্ষা করে — ফলে ধীর হয়ে যায়। অনেক কাজ একসঙ্গে করতে Promise.all ব্যবহার করুন।