Q42. What is Promise.all(), Promise.allSettled(), Promise.race(), and Promise.any()?
চারটি Promise combinator কখন কীভাবে ফল দেয় — একটি তুলনা ছকাটি সহ।
এই চারটি method-ই একসাথে অনেক Promise নিয়ে কাজ করে, কিন্তু কখন সফল হয় আর ফলে কী ফেরত দেয় সেটা আলাদা। মনে রাখার সহজ উপায় হলো তিনটি প্রশ্নের উত্তর দেওয়া — সব সফল হলে কী হবে, একটা ব্যর্থ হলে কী হবে, আর সব ব্যর্থ হলে কী হবে।
const delay = (ms, value) =>
new Promise((resolve) => setTimeout(() => resolve(value), ms));
const p1 = delay(100, "এক");
const p2 = delay(200, "দুই");
const p3 = delay(50, "তিন");// Promise.all — সব সফল হলে চলে, একটা fail করলেই থেমে যায়
Promise.all([p1, p2, p3]).then((values) => {
console.log(values); // ["এক", "দুই", "তিন"] — input-এর ক্রমে
});
// একটা fail করলে সব fail
Promise.all([p1, Promise.reject(new Error("ব্যর্থ")), p3])
.catch((error) => console.log(error.message)); // "ব্যর্থ"// Promise.allSettled — সব শেষ হওয়া পর্যন্ত অপেক্ষা, কখনো fail হয় না
Promise.allSettled([p1, Promise.reject(new Error("ব্যর্থ")), p3])
.then((results) => {
console.log(results);
// [
// { status: "fulfilled", value: "এক" },
// { status: "rejected", reason: Error("ব্যর্থ") },
// { status: "fulfilled", value: "তিন" },
// ]
});// Promise.race — যেটা আগে শেষ হয় সেটাই জেতে, হ্যাঁ হোক বা না
Promise.race([p1, p2, p3]).then((value) => {
console.log(value); // "তিন" — ৫০ms-এই শেষ, অন্যগুলো অপেক্ষায়
});
// fail করা দ্রুত Promise জিতে যায়
Promise.race([p1, delay(20, Promise.reject(new Error("দ্রুত fail")))])
.catch((error) => console.log(error.message)); // "দ্রুত fail"// Promise.any — প্রথম সফল হলেই জেতে, সব fail হলে ধরে
Promise.any([
Promise.reject(new Error("প্রথমটি ব্যর্থ")),
p2,
p3,
]).then((value) => {
console.log(value); // "তিন" — প্রথম fulfilled
});
// সব ব্যর্থ হলে AggregateError
Promise.any([
Promise.reject(new Error("১")),
Promise.reject(new Error("২")),
]).catch((error) => {
console.log(error.name); // "AggregateError"
console.log(error.errors.length); // 2 — সব error পাওয়া যায়
});ধাপে ধাপে — p3 মাত্র ৫০ms-এ শেষ হয়, তাই Promise.race-এ ও Promise.any-এ সেটিই আগে ফেরত আসে। কিন্তু Promise.all ও Promise.allSettled তিনটির জন্যই অপেক্ষা করে, তাই সব ফল একসাথে পাওয়া যায়।
// বাস্তব উদাহরণ — একসাথে ৩টি API call
function loadDashboard() {
return Promise.all([
fetchUser(),
fetchOrders(),
fetchMessages(),
]).then(([user, orders, messages]) => {
return { user, orders, messages };
});
}// সব ফল দেখাতে চাইলে allSettled
function loadDashboardSafe() {
return Promise.allSettled([
fetchUser(),
fetchOrders(),
fetchMessages(),
]).then((results) => {
const [user, orders, messages] = results.map((result) => {
if (result.status === "fulfilled") return result.value;
return null; // fail হলেও যেন বাকিরা দেখা যায়
});
return { user, orders, messages };
});
}// race — timeout বানাতে খুব কাজে লাগে
function withTimeout(promise, ms) {
const timeout = new Promise((_, reject) => {
setTimeout(() => reject(new Error("সময় শেষ")), ms);
});
return Promise.race([promise, timeout]);
}
withTimeout(fetchSlowData(), 3000)
.then((data) => console.log(data))
.catch((error) => console.log(error.message)); // "সময় শেষ"শেষ output-এ fetchSlowData ৩ সেকেন্ডের বেশি সময় নেয় বলে ধরা হলো। race দুটি Promise-এর মধ্যে যেটা আগে শেষ হবে সেটি ফেরত দেয়, তাই timeout-এর Promise হেরে গিয়ে reject হয় এবং catch ধরা পড়ে।
| Method | শেষ হওয়ার নিয়ম | ব্যর্থ হলে | ফেরত দেয় |
|---|---|---|---|
all | সব সফল হলে | একটা fail করলেই থামে | মানের array |
allSettled | সব শেষ হলে | কখনো হয় না | status-সহ object array |
race | যেটা আগে শেষ হয় | fail হলেও ফেরত দেয় | প্রথমের মান বা error |
any | প্রথম সফল হলে | সব fail হলে | প্রথম সফলের মান |
Promise.race ও Promise.any একই মনে হলেও উল্টো কাজ করে — race-এ যেকোনো একটি আগে শেষ হলেই ফল দেয়, আর any-তে শুধু সফল হওয়াটা ধরে। তাই race-এ timeout দিলে timeout-এর reject-ই জিতে যায়, কিন্তু any-তে সব ব্যর্থ হলেই AggregateError আসে।