Promises ES6 (ECMAScript 2015) এর একটি অত্যন্ত গুরুত্বপূর্ণ ফিচার, যা asynchronous (অ্যাসিঙ্ক্রোনাস) কোড লেখার পদ্ধতিকে সহজ এবং সুশৃঙ্খল করে তোলে। একটি Promise হলো একটি অপারেশন (যেমন, API কল বা ফাইল পড়া) যা ভবিষ্যতে কোনো সময়ে সফলভাবে সম্পন্ন হবে (fulfilled) অথবা ব্যর্থ হবে (rejected)। Promises এর মাধ্যমে, আমরা asynchronous কোডকে আরও ভালোভাবে পরিচালনা করতে পারি এবং callback hell এ আটকে না গিয়ে কোডটি আরও পরিষ্কারভাবে লিখতে পারি।
Promise কী?
একটি Promise হলো একটি বিশেষ অবজেক্ট যা asynchronous কাজের সমাপ্তি (অথবা ব্যর্থতা) সম্পর্কে তথ্য দেয়। এটি তিনটি অবস্থায় থাকতে পারে:
- Pending (অপেক্ষমাণ): Promise এখনও সম্পন্ন হয়নি।
- Fulfilled (সম্পন্ন): Promise সফলভাবে সম্পন্ন হয়েছে।
- Rejected (ব্যর্থ): Promise কোনো কারণে ব্যর্থ হয়েছে।
Promise এর Sintax
Promise তৈরি করার জন্য আমরা new Promise() কনস্ট্রাকটর ব্যবহার করি, যেখানে একটি executor function প্রদান করা হয়। এই function দুটি প্যারামিটার নেয়, resolve এবং reject, যা Promise এর অবস্থার উপর ভিত্তি করে ডাকা হয়।
const promise = new Promise((resolve, reject) => {
// কিছু অ্যাসিঙ্ক্রোনাস কাজ
const success = true;
if (success) {
resolve("Operation Successful!"); // Promise সফল হলে
} else {
reject("Operation Failed!"); // Promise ব্যর্থ হলে
}
});
Promise এর ব্যবহার
Promise এর then(), catch() এবং finally() মেথডগুলি ব্যবহৃত হয়, যা Promise এর উপর ভিত্তি করে পরবর্তী অ্যাকশন নির্ধারণ করে।
then(): এটি Promise এর সফলতার জন্য ব্যবহৃত হয়। যখন Promise সফলভাবে সম্পন্ন হয়, তখন এটি কল হয়।
catch(): এটি Promise এর ব্যর্থতার জন্য ব্যবহৃত হয়। যখন Promise ব্যর্থ হয়, তখন এটি কল হয়।
finally(): এটি Promise সম্পন্ন হওয়ার পর (যতটা সফল বা ব্যর্থ হোক) কল হয়। এটি সাধারণত cleanup বা শেষের কাজের জন্য ব্যবহার করা হয়।
Promise ব্যবহার উদাহরণ
const myPromise = new Promise((resolve, reject) => {
let success = true;
if (success) {
resolve("Promise fulfilled successfully!");
} else {
reject("Promise failed!");
}
});
myPromise
.then(result => {
console.log(result); // "Promise fulfilled successfully!"
})
.catch(error => {
console.log(error); // "Promise failed!"
})
.finally(() => {
console.log("Promise execution complete.");
});
এখানে, যদি success সত্য হয়, তবে Promise সফলভাবে সম্পন্ন হবে এবং then() মেথড কল হবে। যদি ব্যর্থ হয়, তবে catch() মেথড কল হবে। finally() মেথডটি সর্বদা কল হবে, অবশেষে কোন অবস্থাতেই হোক না কেন।
Promise Chaining
একাধিক Promise গুলোকে একে একে (চেইন করে) কল করার জন্য Promise chaining ব্যবহার করা হয়। এর মাধ্যমে, একটি Promise সফল হলে, পরবর্তী Promise কল করা হয়।
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => resolve("First Promise resolved"), 1000);
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => resolve("Second Promise resolved"), 2000);
});
promise1
.then(result1 => {
console.log(result1); // "First Promise resolved"
return promise2; // Return the second promise
})
.then(result2 => {
console.log(result2); // "Second Promise resolved"
})
.catch(error => {
console.log(error); // Any error encountered will be caught here
});
এখানে, প্রথম Promise সফল হলে, পরবর্তী Promise কল করা হচ্ছে। then() ব্লকের মধ্যে একটি Promise ফেরত দেয়ার মাধ্যমে chaining কার্যকর করা হয়।
Promise.all()
Promise.all() মেথডটি একাধিক Promise একসাথে পরিচালনা করতে সাহায্য করে। এটি একটি অ্যারে বা iterable গ্রহণ করে এবং সব Promise সফল হলে একটি একক Promise ফেরত দেয়। যদি একটি Promise ব্যর্থ হয়, তাহলে পুরো operation ব্যর্থ হয়।
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, 3000, "Third"));
Promise.all([promise1, promise2, promise3])
.then(results => {
console.log(results); // ["First", "Second", "Third"]
})
.catch(error => {
console.log(error); // Error if any promise fails
});
এখানে, Promise.all() তিনটি Promise কে একসাথে পরিচালনা করছে এবং তাদের সমস্ত ফলাফল একত্রিত করে results অ্যারেতে ফেরত দেয়।
Promise.race()
Promise.race() মেথডটি একটি অ্যারে বা iterable গ্রহণ করে এবং প্রথম যে Promise সম্পন্ন হবে, সেটির ফলাফল (বা ব্যর্থতা) ফেরত দেয়। এটি একাধিক Promise মধ্যে যে Promise প্রথমে সম্পন্ন হয় সেটি চয়ন করে।
const promise1 = new Promise((resolve, reject) => setTimeout(resolve, 500, "First"));
const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 1000, "Second"));
const promise3 = new Promise((resolve, reject) => setTimeout(resolve, 1500, "Third"));
Promise.race([promise1, promise2, promise3])
.then(result => {
console.log(result); // "First" because it resolves first
})
.catch(error => {
console.log(error);
});
এখানে, Promise.race() প্রথম Promise যে কনক্লুড করবে, সেটি নির্বাচন করবে (এক্ষেত্রে "First" হবে, কারণ এটি প্রথমে সম্পন্ন হয়)।
সারাংশ
Promises ES6 এর একটি অত্যন্ত গুরুত্বপূর্ণ বৈশিষ্ট্য, যা অ্যাসিঙ্ক্রোনাস অপারেশনগুলিকে আরও পরিচালনাযোগ্য এবং সহজ করে তোলে। Promises এর মাধ্যমে আপনি একাধিক অ্যাসিঙ্ক্রোনাস কাজ সহজভাবে চেইন করতে, তাদের সফল বা ব্যর্থ ফলাফল পরিচালনা করতে এবং একাধিক Promise এর সমন্বয় করতে সক্ষম হন।
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 এর একটি শক্তিশালী ফিচার যা অ্যাসিনক্রোনাস কোডের ব্যবস্থাপনা এবং প্রবাহকে পরিষ্কার এবং নিয়ন্ত্রিত করে। এটি কোডকে আরও সহজ, পরিষ্কার এবং সহজে রক্ষণাবেক্ষণযোগ্য করে তোলে, বিশেষ করে যখন একাধিক অ্যাসিনক্রোনাস অপারেশন থাকে।
Promise হলো JavaScript এর একটি অস্বাভাবিক (Asynchronous) অপারেশন ব্যবস্থাপনা পদ্ধতি, যা একমাত্র একটি ফলাফল প্রাপ্ত করার জন্য বিভিন্ন স্টেট ব্যবহৃত করে। Promise মূলত তিনটি স্টেট নিয়ে কাজ করে:
- Pending (অপেক্ষমাণ)
- Fulfilled (পূর্ণ)
- Rejected (ব্যর্থ)
এই তিনটি স্টেট Promise এর জীবনের বিভিন্ন মুহূর্তকে চিহ্নিত করে এবং প্রতিটি স্টেটের মধ্যে Promise এর মানের পরিবর্তন ঘটে।
1. Pending (অপেক্ষমাণ)
প্রথমে যখন একটি Promise তৈরি করা হয়, তখন তার স্টেট থাকে pending বা অপেক্ষমাণ। এর মানে হল, Promise এর কার্যকলাপ এখনও শেষ হয়নি এবং তার ফলাফল (যে কাজটি হবে) এখনও পাওয়া যায়নি। অর্থাৎ, Promise এখনো কার্যকর (resolve) বা ব্যর্থ (reject) হয়নি।
let promise = new Promise((resolve, reject) => {
// Promise is still pending
});
console.log(promise); // Pending state
Pending স্টেটের সময়, Promise কেবল অপেক্ষা করছে তার অ্যাসিঙ্ক্রোনাস অপারেশন সম্পন্ন হওয়ার জন্য।
2. Fulfilled (পূর্ণ)
যখন Promise সফলভাবে তার অ্যাসিঙ্ক্রোনাস অপারেশন সম্পন্ন করে এবং ফলাফল প্রদান করে, তখন তার স্টেট fulfilled হয়ে যায়। এর মানে হল যে, Promise সফলভাবে কাজ শেষ করেছে এবং যে মানটি প্রদান করা হবে সেটি resolve() মাধ্যমে পাওয়া যাবে।
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("Operation successful!"), 1000);
});
promise.then((value) => {
console.log(value); // "Operation successful!"
});
এখানে, resolve() কল করার মাধ্যমে Promise এর স্টেট fulfilled হয়ে গিয়েছে এবং এটি সফলভাবে ফলাফল প্রদান করেছে।
3. Rejected (ব্যর্থ)
যখন Promise তার অ্যাসিঙ্ক্রোনাস অপারেশন সম্পন্ন করার পর কোনো ধরনের ত্রুটি বা ব্যর্থতা ঘটে, তখন তার স্টেট rejected হয়ে যায়। এর মানে হল যে, Promise এর কার্যকলাপ ব্যর্থ হয়েছে এবং এটি reject() কলের মাধ্যমে ত্রুটি বা ব্যর্থতার কারণ জানিয়ে দেয়।
let promise = new Promise((resolve, reject) => {
setTimeout(() => reject("Operation failed!"), 1000);
});
promise.catch((error) => {
console.log(error); // "Operation failed!"
});
এখানে, reject() কল করার মাধ্যমে Promise এর স্টেট rejected হয়ে গেছে এবং এটি ব্যর্থতার কারণ প্রদান করেছে।
Promise চেইনিং
যেহেতু Promise একটি Asynchronous অপারেশনকে ম্যানেজ করে, তাই আপনি then(), catch() এবং finally() ব্যবহার করে Promise এর ফলাফল এবং তার স্টেট অনুযায়ী নির্ধারিত কাজ করতে পারেন।
let promise = new Promise((resolve, reject) => {
let success = true;
if (success) {
resolve("Task completed successfully!");
} else {
reject("Task failed.");
}
});
promise
.then((result) => {
console.log(result); // "Task completed successfully!"
})
.catch((error) => {
console.log(error); // "Task failed."
});
এখানে, then() Promise এর fulfilled স্টেটের জন্য ব্যবহৃত হয়, এবং catch() rejected স্টেটের জন্য ব্যবহৃত হয়।
Promise এর সাথে একাধিক স্টেট
একাধিক Promise একসাথে হ্যান্ডেল করতে Promise.all(), Promise.race() ইত্যাদি ব্যবহার করা যায়। এভাবে, একাধিক Promise এর স্টেটের ভিত্তিতে কাজ করা সম্ভব হয়, যেমন:
Promise.all():
যদি একাধিক Promise সব fulfilled হয়, তবে তারা একসাথে ফলাফল রিটার্ন করবে। যদি কোনো একটি Promise rejected হয়, তবে পুরো Promise.all() চেইনটি rejected হয়ে যাবে।
let promise1 = new Promise((resolve) => resolve("First Promise"));
let promise2 = new Promise((resolve, reject) => reject("Second Promise failed"));
Promise.all([promise1, promise2])
.then((values) => {
console.log(values);
})
.catch((error) => {
console.log(error); // "Second Promise failed"
});
এখানে, promise2 এর rejected স্টেট পুরো Promise.all() চেইনটিকে rejected করে দেয়।
সারাংশ
- Pending: Promise তৈরি হওয়ার পর, কিন্তু কাজ সম্পন্ন হয়নি।
- Fulfilled: Promise সফলভাবে কাজ শেষ করেছে এবং ফলাফল প্রদান করেছে।
- Rejected: Promise কোনো কারণে ব্যর্থ হয়েছে এবং ত্রুটি বা সমস্যা জানিয়েছে।
Promise স্টেটের মাধ্যমে অ্যাসিঙ্ক্রোনাস কোড পরিচালনা করা সহজ হয় এবং পারফরম্যান্স উন্নত হয়। then(), catch(), এবং finally() ব্যবহার করে Promise এর ফলাফল এবং স্টেট হ্যান্ডেল করা যায়।
ES6-এ Promises একটি গুরুত্বপূর্ণ নতুন ফিচার হিসেবে পরিচিত। Promise হল একটি অবজেক্ট যা আসন্ন মান বা ফলাফলকে প্রতিশ্রুতি দেয় এবং এটি সফলভাবে সম্পন্ন হলে .then() মেথড ব্যবহার করে রেজাল্ট পাওয়া যায়। আর যদি কোনো ত্রুটি ঘটে, তাহলে .catch() মেথড ব্যবহার করে ত্রুটির হ্যান্ডলিং করা হয়। এই ফিচারটি অ্যাসিনক্রোনাস কোড লেখাকে অনেক সহজ এবং পরিষ্কার করে তোলে।
1. Promise কী?
একটি Promise হলো একটি অবজেক্ট যা একটি ভবিষ্যত মান বা ত্রুটি ফিরে আসার প্রতিশ্রুতি দেয়। Promise এর তিনটি সম্ভবত অবস্থা থাকে:
- Pending: Promise এখনও শেষ হয়নি, এবং এটি কোন ফলাফল দেয়নি।
- Fulfilled: Promise সফলভাবে সম্পন্ন হয়েছে এবং একটি মান (value) প্রদান করেছে।
- Rejected: Promise-এ কোনো ত্রুটি ঘটেছে এবং এটি একটি ত্রুটি (error) প্রদান করেছে।
2. .then() মেথড
.then() মেথডটি Promise সফলভাবে সম্পন্ন হলে কল করা হয়। এটি একটি callback function নেয়, যা Promise Fulfilled হওয়ার পর চলবে। .then() একটি নতুন Promise ফেরত দেয়, যার ফলে চেইনিং (chaining) করা যায়।
উদাহরণ:
let promise = new Promise((resolve, reject) => {
let success = true;
if (success) {
resolve("Promise is resolved!");
} else {
reject("Promise is rejected!");
}
});
promise.then((result) => {
console.log(result); // "Promise is resolved!"
});
এখানে, Promise সফল হলে .then() মেথডে কল করা হবে এবং "Promise is resolved!" প্রিন্ট হবে।
3. .catch() মেথড
.catch() মেথডটি Promise-এ যদি কোনো ত্রুটি ঘটে, তাহলে কল করা হয়। এটি reject() দ্বারা রিটার্ন হওয়া ত্রুটিকে হ্যান্ডেল করে। .catch() একটি একক callback function নেয়, যা Promise Rejected হলে চলবে।
উদাহরণ:
let promise = new Promise((resolve, reject) => {
let success = false;
if (success) {
resolve("Promise is resolved!");
} else {
reject("Promise is rejected!");
}
});
promise.then((result) => {
console.log(result); // এটি চলবে না, কারণ promise.reject() হয়েছে।
}).catch((error) => {
console.log(error); // "Promise is rejected!"
});
এখানে, .catch() Promise রিজেক্ট হওয়ার পর "Promise is rejected!" প্রিন্ট করবে।
4. .then() এবং .catch() চেইনিং
.then() এবং .catch() মেথড চেইনিং এর মাধ্যমে একাধিক অ্যাসিনক্রোনাস অপারেশন সিকোয়েন্স আকারে বাস্তবায়িত করা যেতে পারে। .then() এর মধ্যে পরবর্তী Promise রিটার্ন করা যায় এবং .catch() মেথডটি পুরো চেইনটি হ্যান্ডেল করতে পারে।
উদাহরণ:
let promise = new Promise((resolve, reject) => {
let success = true;
if (success) {
resolve("Step 1: Success");
} else {
reject("Step 1: Failed");
}
});
promise
.then((result) => {
console.log(result); // "Step 1: Success"
return "Step 2: Success"; // Next promise
})
.then((result) => {
console.log(result); // "Step 2: Success"
return "Step 3: Success"; // Next promise
})
.catch((error) => {
console.log(error); // যদি কোনো ত্রুটি হয়, এখানে হ্যান্ডেল হবে
});
এখানে, প্রথম Promise সফল হলে পরবর্তী Promise গুলি চেইন করা হবে এবং একে একে তাদের ফলাফল প্রিন্ট হবে। যদি কোথাও কোনো ত্রুটি ঘটে, তবে .catch() মেথড সেটি হ্যান্ডল করবে।
5. .finally() মেথড
.finally() একটি নতুন ফিচার যা ES8 (ECMAScript 2017)-এ এসেছিল, তবে এটি Promise চেইনে .then() এবং .catch() মেথডের পরে কল করা যায়। এটি Promise Fulfilled বা Rejected হওয়া সত্ত্বেও চূড়ান্ত কিছু কার্যকলাপ সম্পন্ন করতে ব্যবহৃত হয়।
উদাহরণ:
let promise = new Promise((resolve, reject) => {
let success = true;
if (success) {
resolve("Promise is resolved!");
} else {
reject("Promise is rejected!");
}
});
promise
.then((result) => {
console.log(result); // "Promise is resolved!"
})
.catch((error) => {
console.log(error); // যদি ত্রুটি হয়
})
.finally(() => {
console.log("The promise is complete.");
});
এখানে, চূড়ান্ত স্টেটমেন্ট .finally() এর মাধ্যমে প্রিন্ট হবে, যা Promise Fulfilled বা Rejected হওয়া সত্ত্বেও চলে আসবে।
উপসংহার
ES6-এ .then() এবং .catch() মেথড Promise-এর সাথে কাজ করার জন্য ব্যবহৃত হয় এবং অ্যাসিনক্রোনাস কোড পরিচালনা সহজ করে তোলে। .then() সফল ফলাফলকে হ্যান্ডল করতে এবং .catch() ত্রুটি হ্যান্ডল করতে ব্যবহৃত হয়। চেইনিং এবং .finally() মেথডের মাধ্যমে আরো কার্যকর এবং পরিষ্কার কোড লেখা যায়।
Promise ES6 এর একটি অত্যন্ত গুরুত্বপূর্ণ ফিচার, যা asynchronous কোডকে আরও পরিপূর্ণ এবং পরিষ্কারভাবে পরিচালনা করতে সাহায্য করে। Promise Chaining এবং Error Handling এর মাধ্যমে আপনি asynchronous অপারেশনগুলোকে সহজে এবং সঠিকভাবে সম্পন্ন করতে পারেন।
Promise Chaining
Promise Chaining হল একাধিক asynchronous অপারেশনকে একসাথে লিঙ্ক বা চেইন করা, যেখানে এক অপারেশন শেষ হওয়ার পর পরবর্তী অপারেশনটি স্বয়ংক্রিয়ভাবে শুরু হয়। এটি Promise এর then() মেথড ব্যবহার করে করা হয়, যেখানে আপনি একটি Promise এর রেজাল্ট গ্রহণ করেন এবং সেটি পরবর্তী অপারেশনে প্রেরণ করেন।
Promise Chaining এর উদাহরণ:
const fetchData = new Promise((resolve, reject) => {
setTimeout(() => resolve("Data fetched"), 1000);
});
fetchData
.then(result => {
console.log(result); // "Data fetched"
return "Next step";
})
.then(result => {
console.log(result); // "Next step"
return "Final step";
})
.then(result => {
console.log(result); // "Final step"
})
.catch(error => {
console.log("Error:", error); // If any error occurs, it will be caught here
});
এখানে, প্রথম Promise সফলভাবে রেজাল্ট প্রদান করার পর, প্রতিটি then() ব্লক একে একে চালানো হয়, এবং প্রত্যেকটি পরবর্তী then() পূর্ববর্তী Promise এর রেজাল্ট গ্রহণ করে।
Error Handling in Promises
যেহেতু asynchronous কোডে অনেক সময় error হতে পারে, তাই Promise এর মধ্যে Error Handling অত্যন্ত গুরুত্বপূর্ণ। Promise এর সাথে error handling করার জন্য catch() মেথড ব্যবহার করা হয়, যা Promise চেইন করার সময় যে কোনো ধরনের error ধরতে সাহায্য করে।
Error Handling এর উদাহরণ:
const fetchData = new Promise((resolve, reject) => {
const success = false;
setTimeout(() => {
if (success) {
resolve("Data fetched successfully");
} else {
reject("Data fetching failed");
}
}, 1000);
});
fetchData
.then(result => {
console.log(result); // This won't be executed if the promise is rejected
})
.catch(error => {
console.log("Error:", error); // "Error: Data fetching failed"
});
এখানে, fetchData Promise এর মধ্যে যদি কোনো ত্রুটি ঘটে (যেমন reject() কল করা হয়), তবে সেই ত্রুটি catch() ব্লক দ্বারা ধরা হবে।
Promise Chaining এবং Error Handling এর সাথে Combined Example
আপনি Promise Chaining এবং Error Handling একত্রিত করে আরও উন্নত asynchronous কোড লিখতে পারেন। একাধিক asynchronous অপারেশন চেইন করতে পারেন এবং ত্রুটিগুলোকে সঠিকভাবে ধরতে পারেন।
Combined Example:
const fetchData = new Promise((resolve, reject) => {
setTimeout(() => resolve("Data fetched"), 1000);
});
const processData = new Promise((resolve, reject) => {
setTimeout(() => resolve("Data processed"), 1000);
});
const saveData = new Promise((resolve, reject) => {
setTimeout(() => reject("Saving data failed"), 1000);
});
fetchData
.then(result => {
console.log(result); // "Data fetched"
return processData;
})
.then(result => {
console.log(result); // "Data processed"
return saveData;
})
.then(result => {
console.log(result); // This won't be executed due to the rejection
})
.catch(error => {
console.log("Error:", error); // "Error: Saving data failed"
});
এখানে, প্রথম দুটি Promise সফলভাবে রেজাল্ট প্রদান করে, কিন্তু saveData Promise ত্রুটি ঘটায়। সেই কারণে, catch() ব্লকটি ত্রুটি ধরে নিয়ে "Saving data failed" মেসেজটি প্রিন্ট করবে।
Promise.all() এবং Error Handling
যখন আপনি একাধিক asynchronous অপারেশন একসাথে চালাতে চান, তখন Promise.all() ব্যবহার করা হয়। এটি সব Promise সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করে এবং সবগুলো Promise সফল হলে রেজাল্ট প্রদান করে। যদি একটি Promise ত্রুটি দেয়, তবে তা সকল Promise গুলোর ফলাফলকে ব্যর্থ করে দেয়।
Promise.all() এর উদাহরণ:
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => resolve("Data fetched"), 1000);
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => resolve("Data processed"), 1000);
});
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => reject("Error in saving data"), 1000);
});
Promise.all([promise1, promise2, promise3])
.then(results => {
console.log(results); // This won't be executed if any promise rejects
})
.catch(error => {
console.log("Error:", error); // "Error: Error in saving data"
});
এখানে, promise3 ত্রুটি ঘটাচ্ছে, তাই catch() ব্লকটি সক্রিয় হবে এবং ত্রুটির বার্তা প্রিন্ট করবে।
Promise.race()
Promise.race() ফাংশনটি একাধিক Promise এর মধ্যে যে কোনো একটি Promise সবচেয়ে দ্রুত সম্পন্ন হবে তার ফলাফল প্রদান করে। যদি প্রথম Promise ত্রুটি দেয়, তবে সেই ত্রুটি ধরা হয়।
Promise.race() এর উদাহরণ:
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => resolve("Data fetched"), 2000);
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => resolve("Data processed"), 1000);
});
Promise.race([promise1, promise2])
.then(result => {
console.log(result); // "Data processed" (Because promise2 resolves first)
})
.catch(error => {
console.log("Error:", error);
});
এখানে, promise2 প্রথমে সম্পন্ন হয়, তাই তার রেজাল্ট Data processed প্রিন্ট হবে।
সারাংশ
Promise Chaining এবং Error Handling ES6 এ asynchronous কোড পরিচালনার জন্য অত্যন্ত কার্যকরী ফিচার। Promise Chaining দ্বারা আপনি একাধিক asynchronous অপারেশন একে একে সম্পন্ন করতে পারেন এবং Error Handling দ্বারা ত্রুটিগুলো সঠিকভাবে ধরতে পারেন। Promise.all(), Promise.race() এর মত ফাংশনগুলি আরও বেশি নিয়ন্ত্রণ এবং সমন্বয় প্রদান করে asynchronous কোডে।
Read more