Async/Await
async function, await, try/catch, Promise.all/race, Promise-এর চেয়ে পরিষ্কার async কোড — বাংলায়।
Promise-এর chain-গুলো দ্রুত জটিল হয়। `async`/`await` দিয়ে async কোড প্রায় synchronous-এর মতো সরল হয়ে যায় — পড়া ও বজায় রাখা সহজ।
async function
async function greet() {
return "নমস্কার";
}
console.log(greet()); // Promise { <fulfilled>: "নমস্কার" }
greet().then(console.log); // নমস্কারasync function সবসময় একটি Promise দেয় — return-এর মান promise থেকে শেষ। throw করলে rejected promise।
await
function wait(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function run() {
console.log("শুরু");
await wait(1000); // এখানে থামে, promise settle-এর অপেক্ষায়
console.log("1 সেকেন্ড পরে");
}
run();await কেবল async function-এর ভেতরে চলে — Promise settle হওয়া পর্যন্ত pause মানে block নয়; event loop অন্য কাজ করতে পারে।
fetch + await
async function loadUser() {
const res = await fetch("/api/user");
const user = await res.json();
console.log(user.name);
}
loadUser();Error handling — try/catch
async function loadUser() {
try {
const res = await fetch("/api/user");
if (!res.ok) {
throw new Error(`HTTP ${res.status}`);
}
const user = await res.json();
console.log(user.name);
} catch (err) {
console.error("সমস্যা:", err.message);
}
}
loadUser();await-এ reject হলে exception-এর মতো — try/catch দিয়ে ধরা যায়। এটিই .then().catch() চেয়ে সুন্দর — promise chain-এর চেয়ে error handling এক জায়গায়।
finally
async function save() {
setLoading(true);
try {
await api.save(data);
} catch (err) {
toast(err.message);
} finally {
setLoading(false); // success/error — উভয়ক্ষেত্রেই
}
}Parallel — Promise.all
async function loadAll() {
const [user, posts, likes] = await Promise.all([
fetch("/api/user").then((r) => r.json()),
fetch("/api/posts").then((r) => r.json()),
fetch("/api/likes").then((r) => r.json()),
]);
console.log(user, posts, likes);
}Promise.all একসাথে parallel-এ চালায়, সব settle পর্যন্ত অপেক্ষা। ধীর-operations-কে একের পর এক না চালিয়ে এভাবে দ্রুত করা যায়। কোনোটি reject-এ গেলে সব দেয় rejected।
Promise.race
async function withTimeout(promise, ms) {
const timeout = new Promise((_, reject) =>
setTimeout(() => reject(new Error("timeout")), ms),
);
return Promise.race([promise, timeout]);
}
// 3 সেকেন্ডের মাঝে উত্তর না পেলে error
const data = await withTimeout(loadData(), 3000);await-এ loop
async function processAll(items) {
for (const item of items) {
await process(item); // একে একে — order ঠিক
}
}
// সমান্তরাল — order অগুরুত্বপূর্ণ, এটা দ্রুত কিন্তু ধারাবাহিক নয়
async function parallel(items) {
await Promise.all(items.map(process));
}for...of + await ধারাবাহিক। parallel দরকার হলে Promise.all। কোনটা কোন পরিস্থিতিতে — ডেটা একে অন্যের উপর নির্ভর করলে sequential, না হলে parallel।
| কৌশল | ব্যবহার |
|---|---|
async | promise-র function |
await | promise settle-এর অপেক্ষা |
try/catch/finally | error ও cleanup |
Promise.all | parallel সব settle |
Promise.race | প্রথম settle — timeout প্যাটার্ন |
await শুধু async function-এ চলে। global/regular function-এ লিখলে SyntaxError।
"Promise chain বনাম async/await?" — async/await আরও পাঠযোগ্য, try/catch সহজ, টপ-লেভেল flow পরিষ্কার; chain-এ stepwise catch/transform বেশি control।
দুটি API থেকে ডেটা parallel-এ আনুন (Promise.all), একটিতে fail-এ fallback দেখান — error handling সহ।