Q22. Explain how Promises work in JavaScript.
Promise-এর তিনটি state, then/catch/finally চেইন এবং একসাথে কয়েকটি কাজ সম্পন্ন করা।
Promise হলো ভবিষ্যতে কোনো ফলাফল পাওয়া যাবে কি না তার প্রতিশ্রুতি — এখনই ফল না পেয়েও ফল আসলে জানার ব্যবস্থা। এটির তিনটি state আছে: pending (চলছে), fulfilled (সফল) আর rejected (ব্যর্থ)।
const promise = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve("সফল");
}, 1000);
});
promise.then(function (value) {
console.log(value); // "সফল"
});ধাপে ধাপে — new Promise চালানোর সঙ্গে সঙ্গে state pending হয়। এক সেকেন্ড পর timer শেষ হয়ে resolve ডাকে, তখন Promise fulfilled হয় এবং .then-এর ভিতরের কোড চলে।
ফলাফল পেতে .then(), ভুল ধরতে .catch(), আর যেকোনো অবস্থায় কিছু করতে .finally() ব্যবহার হয়।
fetch("/api/user")
.then(function (res) {
return res.json();
})
.then(function (user) {
console.log(user.name);
})
.catch(function (error) {
console.error("সমস্যা:", error.message);
})
.finally(function () {
console.log("সবসময় চলবে");
});Chaining-এর মূল কথা — প্রতিটি then যে মান ফেরত দেয়, সেটাই পরের then-এর ইনপুট হয়। তাই একটা সাফল্য কিছু ফিরিয়ে দিলে সেটা পরের ধাপে চলে যায়।
// return না দিলে চেইন ভেঙে যায়
fetch("/api/user")
.then(function (res) {
res.json(); // return নেই!
})
.then(function (user) {
console.log(user); // undefined
});একসাথে অনেক কাজ শেষ হওয়া পর্যন্ত অপেক্ষা করার জন্য Promise.all, আর কোনো একটা ব্যর্থ হলেই থামতে Promise.allSettled, Promise.race ও Promise.any ব্যবহার হয়।
// সব ফলাফলের অপেক্ষায়
Promise.all([getUser(), getPosts()]).then(function (results) {
console.log(results[0], results[1]);
});
// যেকোনো একটা ব্যর্থ হলেই থামে
Promise.race([timeout(3000), save()]).catch(function () {
console.log("সময় শেষ");
});
// সবগুলোর ফলাফল চায়, ব্যর্থ হলেও
Promise.allSettled([a(), b()]).then(function (results) {
console.log(results.map(function (r) { return r.status; }));
});| Method | ফলাফল |
|---|---|
Promise.all | সবগুলো সফল হলে ফলাফল, একটা ব্যর্থ হলে reject |
Promise.allSettled | সবগুলো শেষ হলে সফল ও ব্যর্থ দুটোর তালিকা |
Promise.race | যেটা আগে শেষ হয়, সেটাই |
Promise.any | যেটা আগে সফল হয়, সেটাই |
Promise তৈরি করার পর সাথে সাথে .then বা .catch জুড়ে দিতে হবে — নাহলে ভুল ঘটলে সেটা ধরা পড়ে না এবং unhandled rejection দেখা যায়।