Promise হল JavaScript এর একটি মেকানিজম যা অ্যাসিনক্রোনাস (asynchronous) কোডের হ্যান্ডলিংকে আরও সহজ এবং কার্যকর করে তোলে। একটি Promise এমন একটি অবজেক্ট যা ভবিষ্যতে সফলভাবে বা ব্যর্থভাবে কোনো অপারেশন সম্পন্ন হওয়ার ফলাফল ধারণ করবে। এটি অ্যাসিনক্রোনাস কোডের ফলাফলকে সহজভাবে ট্র্যাক করতে এবং প্রসেস করতে সাহায্য করে।
ES6 তে Promises যোগ করা হয়, যা callback-এ নির্ভরশীল সমস্যা গুলো সমাধান করে। Callback এর মাধ্যমে অ্যাসিনক্রোনাস অপারেশন পরিচালনা করলে কোড প্রায়ই "callback hell" বা "pyramid of doom"-এ পরিণত হয়, যেখানে nested callbacks কোডকে আরও জটিল এবং পড়তে কঠিন করে তোলে। Promises এই সমস্যা সমাধান করে।
Promise এর স্টেটস (States)
Promise তিনটি প্রধান স্টেটে থাকতে পারে:
- Pending (অপেক্ষমাণ): Promise শুরু হয়ে যায়, কিন্তু এখনও কোন ফলাফল আসেনি (এখনো রেজল্ট হয়নি)।
- Resolved (Fulfilled) (সম্পন্ন): Promise সফলভাবে সম্পন্ন হয়েছে এবং মান (value) প্রদান করা হয়েছে।
- Rejected (ব্যর্থ): Promise ব্যর্থ হয়ে গেছে এবং ত্রুটি (error) ঘটেছে।
Promise এর সিনট্যাক্স
const promise = new Promise((resolve, reject) => {
// কিছু অ্যাসিনক্রোনাস অপারেশন
let success = true; // ধরুন, কোন অপারেশন সফল
if (success) {
resolve("Operation Successful!"); // সফল হলে resolve() কল হবে
} else {
reject("Operation Failed!"); // ব্যর্থ হলে reject() কল হবে
}
});
এখানে resolve() এবং reject() হল ফাংশন, যেগুলি Promise কে রেজলভ বা রিজেক্ট করার জন্য ব্যবহৃত হয়।
Promise এর ব্যবহার
1. Promise চেইনিং (Promise Chaining)
Promise এর সবচেয়ে বড় সুবিধা হচ্ছে, এটি চেইনিং (chaining) করতে সাহায্য করে। এক Promise থেকে আরেক Promise পর্যন্ত চেইন করা যায়, যেটি অ্যাসিনক্রোনাস কোডকে আরও কার্যকর এবং পরিষ্কার করে।
const promise = new Promise((resolve, reject) => {
let success = true;
if (success) {
resolve("Step 1 Successful");
} else {
reject("Step 1 Failed");
}
});
promise
.then((result) => {
console.log(result); // "Step 1 Successful"
return "Step 2 Successful"; // নতুন Promise রিটার্ন করছে
})
.then((result) => {
console.log(result); // "Step 2 Successful"
})
.catch((error) => {
console.error(error); // ত্রুটির জন্য error হ্যান্ডলিং
});
এখানে, then() এবং catch() মেথডের মাধ্যমে Promise চেইনিং করা হয়েছে। then() মেথড Promise রেজলভ হলে কল হয় এবং catch() মেথড Promise রিজেক্ট হলে ত্রুটি হ্যান্ডলিং করে।
2. Promise.all()
যখন একাধিক অ্যাসিনক্রোনাস অপারেশন একসাথে চালানো হয় এবং তাদের সবগুলোর সফল ফলাফল প্রাপ্তি নিশ্চিত করতে হয়, তখন Promise.all() ব্যবহার করা হয়।
const promise1 = new Promise((resolve, reject) => setTimeout(resolve, 1000, "First"));
const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 2000, "Second"));
const promise3 = new Promise((resolve, reject) => setTimeout(resolve, 1500, "Third"));
Promise.all([promise1, promise2, promise3])
.then((results) => {
console.log(results); // ["First", "Second", "Third"]
})
.catch((error) => {
console.error(error); // কোন একটি Promise যদি reject হয়
});
এখানে, Promise.all() তিনটি Promise একসাথে শুরু করে এবং সবগুলো সফলভাবে রেজলভ হলে একটি অ্যারে হিসেবে তাদের ফলাফল প্রদান করে।
3. Promise.race()
যখন একাধিক Promise মধ্যে সবচেয়ে দ্রুত রেজলভ হওয়া Promise এর ফলাফল প্রাপ্তি চাই, তখন Promise.race() ব্যবহার করা হয়।
const promise1 = new Promise((resolve, reject) => setTimeout(resolve, 2000, "First"));
const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 1000, "Second"));
Promise.race([promise1, promise2])
.then((result) => {
console.log(result); // "Second" (কারণ promise2 দ্রুত রেজলভ হয়েছে)
})
.catch((error) => {
console.error(error);
});
এখানে, Promise.race() যেই Promise প্রথমে রেজলভ বা রিজেক্ট হবে, সেটি তার ফলাফল প্রদান করবে।
Promises এর প্রয়োজনীয়তা
- অ্যাসিনক্রোনাস কোড সহজ করা: JavaScript এ প্রচুর অ্যাসিনক্রোনাস অপারেশন থাকে (যেমন, HTTP রিকোয়েস্ট, ফাইল রিডিং), এবং এগুলোর সঠিকভাবে হ্যান্ডলিং না করলে কোড জটিল হয়ে যায়। Promise এই অ্যাসিনক্রোনাস কোডের জন্য ক্লিনার এবং সহজ উপায় প্রদান করে।
- Callback Hell থেকে মুক্তি: Promise ব্যবহার করার মাধ্যমে nested callback গুলোর (callback hell) সমস্যা এড়ানো যায়, কারণ Promise গুলির মধ্যে
.then()এবং.catch()মেথডগুলোর মাধ্যমে সহজে কোড চেইন করা যায়। - Error Handling সহজ করা: সাধারণ callback ফাংশনগুলিতে error handling খুবই জটিল হতে পারে, কিন্তু Promise এর মাধ্যমে সেন্ট্রালাইজড error handling সম্ভব হয়, যা কোডকে আরও পরিষ্কার এবং রক্ষণাবেক্ষণে সহজ করে।
- Multiple Async Operations Handle করা: একাধিক অ্যাসিনক্রোনাস অপারেশনকে সমন্বয় করে তাদের ফলাফল একত্রে ব্যবহারের জন্য Promise যেমন
Promise.all(),Promise.race()ইত্যাদি অনেক সুবিধা প্রদান করে।
সারাংশ
Promises ES6 এর একটি শক্তিশালী ফিচার যা অ্যাসিনক্রোনাস কোডের ব্যবস্থাপনা এবং প্রবাহকে পরিষ্কার এবং নিয়ন্ত্রিত করে। এটি কোডকে আরও সহজ, পরিষ্কার এবং সহজে রক্ষণাবেক্ষণযোগ্য করে তোলে, বিশেষ করে যখন একাধিক অ্যাসিনক্রোনাস অপারেশন থাকে।
Read more