Async/Await ES6 এর পরে ES7 (ECMAScript 2017) তে পরিচিত একটি নতুন ফিচার, যা Asynchronous কোডকে লেখার জন্য একটি সহজ, পরিষ্কার এবং সিনক্রোনাস মতো অভ্যেস প্রদান করে। এই ফিচারটি Promises এর উপর ভিত্তি করে কাজ করে, তবে সেগুলোকে আরো সহজে এবং স্বাভাবিকভাবে হ্যান্ডেল করতে সহায়ক।
1. Async/Await কি?
- Async: যখন কোনো ফাংশনকে
asyncকিওয়ার্ড দিয়ে ডিফাইন করা হয়, তখন সেটি একটি Promise রিটার্ন করে। এমনকি যদি ফাংশনটি কিছু রিটার্ন না করে, তবুও তা একটি Resolved Promise রিটার্ন করে। - Await:
awaitকিওয়ার্ড একটি Promise এর পরের মানটি পেতে ব্যবহৃত হয়। এটি কেবলমাত্রasyncফাংশনের মধ্যে ব্যবহার করা যেতে পারে এবং এটি Promise সমাপ্ত হওয়া পর্যন্ত কার্যক্রমকে ব্লক করে রাখে, তবে এটি Non-blocking।
2. Async/Await ব্যবহার করার সুবিধা
- কোডের ক্লিনলিনেস:
AsyncওAwaitব্যবহার করলে কোড অনেক পরিষ্কার এবং সহজ হয়ে যায়। এর মাধ্যমে আপনি Promises কে Chain না করে সরাসরি সিঙ্ক্রোনাস (synchronous) কোডের মতো লিখতে পারেন। - Error Handling:
Async/Awaitএর মাধ্যমেtry/catchব্লকের সাহায্যে খুব সহজে এরর হ্যান্ডলিং করা যায়। - ব্লকিং ছাড়া সিঙ্ক্রোনাস কোড: এটি Promise এর ব্যবহার খুব সহজ করে তোলে, তবে Non-blocking মেজাজ বজায় রাখে।
3. Async/Await ব্যবহার করার নিয়ম
Async Function Declaration
যখন একটি ফাংশনকে async কিওয়ার্ড দিয়ে ডিফাইন করা হয়, তখন সেটি একটি Promise রিটার্ন করে। এই ফাংশনের ভিতরে await ব্যবহার করা যেতে পারে।
async function fetchData() {
return "Data fetched!";
}
fetchData().then(result => console.log(result)); // "Data fetched!"
এখানে, fetchData() ফাংশনটি একটি Promise রিটার্ন করে, তবে যেহেতু ফাংশনটি async ছিল, এটি সরাসরি then() মেথডে ব্যবহার করা যায়।
4. Await এর ব্যবহার
await কিওয়ার্ড async ফাংশনের মধ্যে Promise এর পরবর্তী মান আসা পর্যন্ত অপেক্ষা করতে ব্যবহার করা হয়।
Promise এর সাথে Await
async function getUser() {
let response = await fetch("https://api.example.com/user");
let data = await response.json();
console.log(data);
}
getUser();
এখানে, await ব্যবহার করা হয়েছে যা fetch অ্যাসিনক্রোনাস অপারেশন শেষ না হওয়া পর্যন্ত অপেক্ষা করবে এবং তারপর response.json() এর মান প্রদান করবে।
5. Async/Await এর সাথে Error Handling
Async/Await এর সাথে আপনি try/catch ব্লক ব্যবহার করে খুব সহজে এরর হ্যান্ডলিং করতে পারেন, যা Promises এর .catch() এর মতোই কাজ করে।
async function getUserData() {
try {
let response = await fetch("https://api.example.com/user");
if (!response.ok) {
throw new Error("Network response was not ok");
}
let data = await response.json();
console.log(data);
} catch (error) {
console.error("There was an error!", error);
}
}
getUserData();
এখানে, try/catch ব্লক ব্যবহার করা হয়েছে, যাতে ফেচ অপারেশন বা JSON পার্সিং এর মধ্যে কোনো ত্রুটি হলে তা হ্যান্ডেল করা যায়।
6. Parallel Execution with Async/Await
একাধিক অ্যাসিনক্রোনাস কাজ একসাথে চালানোর জন্য, আপনি Promise.all() ব্যবহার করতে পারেন। এতে একাধিক Promise একসাথে সম্পন্ন হবে এবং তাদের ফলাফল একটি অ্যারে আকারে পাওয়া যাবে।
async function fetchMultipleData() {
let [response1, response2] = await Promise.all([
fetch("https://api.example.com/data1"),
fetch("https://api.example.com/data2")
]);
let data1 = await response1.json();
let data2 = await response2.json();
console.log(data1, data2);
}
fetchMultipleData();
এখানে, Promise.all() ব্যবহার করে দুইটি API কল একসাথে চালানো হয়েছে, এবং দুইটি ফলাফল একসাথে আনা হয়েছে।
7. Async/Await এবং Promise এর পার্থক্য
- Promises: Promises অ্যাসিনক্রোনাস অপারেশনকে হ্যান্ডল করার জন্য
.then()এবং.catch()মেথড ব্যবহার করে। - Async/Await: Async/Await সিঙ্ক্রোনাস স্টাইল কোডের মতো দেখালেও আসলে এটি অ্যাসিনক্রোনাস। এটি
then()এবংcatch()চেইনিং থেকে মুক্তি দেয়।
উদাহরণ:
Promise Syntax:
fetch("https://api.example.com/data")
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.log("Error:", error));
Async/Await Syntax:
async function fetchData() {
try {
let response = await fetch("https://api.example.com/data");
let data = await response.json();
console.log(data);
} catch (error) {
console.log("Error:", error);
}
}
সারাংশ
Async/Await ES6 এর পরবর্তী সংস্করণে নতুনভাবে পরিচিত হওয়া একটি শক্তিশালী ফিচার, যা অ্যাসিনক্রোনাস কোড লেখা এবং পরিচালনা করা অনেক সহজ করে তোলে। এটি Promises এর উপর ভিত্তি করে কাজ করে, তবে কোডকে আরও সোজা এবং পরিষ্কারভাবে উপস্থাপন করতে সাহায্য করে। async কিওয়ার্ড ফাংশনকে Promise রিটার্ন করতে সাহায্য করে এবং await কিওয়ার্ড Promise সমাপ্ত হওয়া পর্যন্ত অপেক্ষা করে।
Async Functions ES6 (ECMAScript 2015) এ একটি নতুন ফিচার, যা অ্যাসিঙ্ক্রোনাস কোড লেখা এবং পরিচালনা করা সহজ করে তোলে। async এবং await কিওয়ার্ড ব্যবহার করে আপনি অ্যাসিঙ্ক্রোনাস অপারেশনগুলোকে সিঙ্ক্রোনাস ফাংশনের মতো দেখতে এবং লিখতে পারবেন, যা কোডের রিডেবিলিটি এবং ডিবাগিং প্রক্রিয়া অনেক সহজ করে তোলে।
Async Functions কী?
async ফাংশন হলো এমন একটি ফাংশন, যা অ্যাসিঙ্ক্রোনাস কাজ (যেমন, নেটওয়ার্ক কল, টাইমআউট, ডেটাবেস অপারেশন) সম্পাদন করতে সক্ষম। async ফাংশনটি সরাসরি একটি Promise রিটার্ন করে এবং এর মধ্যে await কিওয়ার্ড ব্যবহার করে প্রমিজের রেজাল্ট অ্যাক্সেস করা হয়।
Async Functions এর ব্যবহার
Async Function Declaration: আপনি যখন একটি ফাংশনকে
asyncহিসেবে ডিফাইন করবেন, তখন তা একটি Promise রিটার্ন করবে।উদাহরণ:
async function fetchData() { return "Data fetched successfully!"; } fetchData().then(result => console.log(result)); // "Data fetched successfully!"এখানে,
fetchData()ফাংশনটিasyncহওয়ায় এটি একটি Promise রিটার্ন করেছে, এবং তার পরেthen()ব্যবহার করে প্রমিজের রেজাল্ট পাওয়া গেছে।
Await কিওয়ার্ড
await কিওয়ার্ডটি শুধু async ফাংশনের মধ্যে ব্যবহার করা যেতে পারে এবং এটি Promise এর রেজাল্টের জন্য অপেক্ষা করে। এটি একটি প্রমিজের রেজাল্ট পাওয়ার পরবর্তী লাইন কার্যকর হতে দেয়। await ব্যবহারের মাধ্যমে অ্যাসিঙ্ক্রোনাস কোডকে সিঙ্ক্রোনাস কোডের মতো দেখতে এবং লেখতে পারবেন।
উদাহরণ:
async function fetchData() {
let result = await fetch('https://api.example.com/data');
let data = await result.json();
return data;
}
fetchData().then(data => console.log(data)); // রিটার্নড ডেটা এখানে প্রদর্শিত হবে
এখানে, await fetch(...) দিয়ে প্রমিজটি রেজাল্ট পাওয়ার জন্য অপেক্ষা করা হচ্ছে, এবং তার পরের await result.json() স্টেটমেন্টটি ডেটা ফরম্যাটে রূপান্তর করে।
Async Functions এর সুবিধা
- সিঙ্ক্রোনাস কোডের মতো অ্যাসিঙ্ক্রোনাস কোড লেখা:
asyncএবংawaitকিওয়ার্ড ব্যবহার করে অ্যাসিঙ্ক্রোনাস কোডকে সিঙ্ক্রোনাস কোডের মতো দেখতে এবং লিখতে পারবেন। এতে কোড পড়া এবং ডিবাগ করা অনেক সহজ হয়, কারণ আপনি বারবার.then()বা.catch()ব্যবহার করতে হয় না। - এস্যাঙ্ক্রোনাস অপারেশনগুলোকে সহজে পরিচালনা করা: যখন আপনি অ্যাসিঙ্ক্রোনাস কাজগুলোর জন্য
awaitব্যবহার করেন, তখন কোড একটানা চলতে থাকে, যেমন কোনো দীর্ঘ সময় নেয়ার কাজ সম্পন্ন না হওয়া পর্যন্ত পরবর্তী কোড লাইন এক্সিকিউট হয় না। এটি কোডের সঠিক অর্ডার মেনে চলতে সাহায্য করে। - প্রমিজের সাথে সমন্বয়:
asyncফাংশন প্রমিজ রিটার্ন করে, তাই আপনি সহজেই প্রমিজেরthen(),catch(), এবংfinally()ব্যবহার করতে পারেন। এটি প্রমিজের ব্যবস্থাপনা আরও শক্তিশালী এবং কার্যকর করে তোলে।
Error Handling with Async/Await
এ্যাসিঙ্ক্রোনাস কোডে ভুল হওয়া অত্যন্ত সাধারণ, তবে async এবং await এর মাধ্যমে try...catch ব্লক ব্যবহার করে সহজে এরর হ্যান্ডলিং করা যেতে পারে।
উদাহরণ:
async function fetchData() {
try {
let response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error('Network response was not ok');
}
let data = await response.json();
return data;
} catch (error) {
console.error('There was a problem with the fetch operation:', error);
}
}
fetchData();
এখানে, try...catch ব্লক ব্যবহার করে await এর মধ্যে কোনো এরর হলে তা সহজেই ক্যাচ করা যায়।
Conclusion
Async Functions ES6 এর একটি অত্যন্ত গুরুত্বপূর্ণ ফিচার, যা অ্যাসিঙ্ক্রোনাস কোড লেখাকে আরও সহজ, পরিষ্কার এবং রিডেবল করে তোলে। async এবং await কিওয়ার্ডের মাধ্যমে আপনি অ্যাসিঙ্ক্রোনাস অপারেশনগুলোকে সিঙ্ক্রোনাস কোডের মতো পরিচালনা করতে পারবেন এবং এতে কোডের রিডেবিলিটি, ডিবাগিং সুবিধা, এবং সাধারণ ব্যবস্থাপনা আরও উন্নত হয়।
async এবং await ES6 এর দুটি গুরুত্বপূর্ণ ফিচার যা অ্যাসিনক্রোনাস কোডকে সিঙ্ক্রোনাস কোডের মতো সহজে পড়া এবং ব্যবস্থাপনা করতে সহায়তা করে। এগুলি Promises এর উপর ভিত্তি করে কাজ করে, কিন্তু আরও পরিষ্কার এবং সহজ সিনট্যাক্স প্রদান করে।
async কিওয়ার্ড
async কিওয়ার্ড একটি ফাংশনকে অ্যাসিনক্রোনাস হিসেবে চিহ্নিত করে, অর্থাৎ সেই ফাংশনটি Promise রিটার্ন করবে। একটি async ফাংশনের মধ্যে থাকা কোড ব্লক আসলে সিঙ্ক্রোনাস এবং তা ধারাবাহিকভাবে এক্সিকিউট হয়, তবে এটি আসলে Promises এর মাধ্যমে কাজ করে।
উদাহরণ:
async function fetchData() {
return "Data fetched";
}
fetchData().then(result => {
console.log(result); // "Data fetched"
});
এখানে fetchData() ফাংশনটি একটি Promise রিটার্ন করবে, এবং এটি একটি অ্যাসিনক্রোনাস ফাংশন হিসেবে কাজ করবে।
await কিওয়ার্ড
await কিওয়ার্ডকে শুধুমাত্র async ফাংশনের মধ্যে ব্যবহার করা যায়। এটি একটি Promise এর ফলাফল পাওয়ার জন্য অপেক্ষা করতে বলে। যখন await ব্যবহৃত হয়, তখন ফাংশনটি ওই Promise এর রেজাল্ট পাওয়ার পরই পরবর্তী কোড এক্সিকিউট করবে।
উদাহরণ:
async function fetchData() {
let data = await Promise.resolve("Data fetched");
console.log(data); // "Data fetched"
}
fetchData();
এখানে, await Promise এর রেজাল্টের জন্য অপেক্ষা করছে এবং তারপর রেজাল্টটি কনসোল লগে প্রদর্শিত হচ্ছে।
async এবং await এর সুবিধা
- কোড পড়তে সহজ:
asyncএবংawaitব্যবহার করার ফলে অ্যাসিনক্রোনাস কোড সিঙ্ক্রোনাস কোডের মতো দেখতে হয়, যা কোডের রিডেবিলিটি (readability) এবং ডিবাগিংকে সহজ করে তোলে। - Promises থেকে সহজে কাজ:
asyncএবংawaitব্যবহার করে আপনি Promises এর সাথে কাজ করতে পারবেন অনেক সহজে। অতিরিক্ত.then()এবং.catch()ব্যবহারের প্রয়োজন নেই। - এরর হ্যান্ডলিং:
asyncএবংawaitএর সাথেtry...catchব্লক ব্যবহার করে সহজে ত্রুটি (error) হ্যান্ডল করা যায়।
এরর হ্যান্ডলিং with try...catch
async এবং await এর সাথে try...catch ব্যবহার করা হয় যাতে অ্যাসিনক্রোনাস অপারেশনগুলোর ত্রুটি (error) সহজে হ্যান্ডল করা যায়।
উদাহরণ:
async function fetchData() {
try {
let data = await Promise.reject("Error occurred");
console.log(data); // Won't be executed
} catch (error) {
console.log(error); // "Error occurred"
}
}
fetchData();
এখানে, Promise.reject() ব্যবহার করা হয়েছে, যা একটি rejected Promise রিটার্ন করে। await অপেক্ষা করবে এবং ত্রুটি ঘটলে সেটি catch ব্লকে ধরা হবে।
Multiple Await (একাধিক await)
একাধিক await ব্যবহার করে আপনি একাধিক অ্যাসিনক্রোনাস অপারেশনকে সিকোয়েন্সিয়ালি (sequentially) এক্সিকিউট করতে পারেন।
উদাহরণ:
async function fetchData() {
let data1 = await Promise.resolve("Data 1");
console.log(data1); // "Data 1"
let data2 = await Promise.resolve("Data 2");
console.log(data2); // "Data 2"
}
fetchData();
এখানে, প্রথমে data1 রিজল্ট পাওয়ার পরই data2 রিজল্ট পাওয়া যাবে।
Parallel Execution with Promise.all
যদি আপনি একাধিক অ্যাসিনক্রোনাস অপারেশনকে একসাথে (parallel) এক্সিকিউট করতে চান, তবে Promise.all() ব্যবহার করতে পারেন। এটি একাধিক Promise কে একসাথে রান করিয়ে, সমস্ত Promise সফলভাবে শেষ হওয়ার পর তাদের রেজাল্ট ফেরত দেয়।
উদাহরণ:
async function fetchData() {
const result = await Promise.all([
Promise.resolve("Data 1"),
Promise.resolve("Data 2"),
Promise.resolve("Data 3")
]);
console.log(result); // ["Data 1", "Data 2", "Data 3"]
}
fetchData();
এখানে, সব Promise একসাথে রান হচ্ছে এবং await ব্যবহার করে তাদের রেজাল্ট একসাথে পাওয়া যাচ্ছে।
async এবং await এর মাধ্যমে কোড সহজ এবং পরিষ্কার হয়, বিশেষত যখন আপনি নেটওয়ার্ক কল, ডেটা ফেচিং, টাইমআউট অথবা অন্যান্য অ্যাসিনক্রোনাস অপারেশন পরিচালনা করছেন। এর মাধ্যমে কোডের লজিক সহজে বুঝতে ও ডিবাগ করতে পারবেন, এবং এটি অ্যাসিনক্রোনাস কোডের সাথে কাজ করা আরও সরল করে তোলে।
ES6 (ECMAScript 2015) এ Promises এর মাধ্যমে অ্যাসিঙ্ক্রোনাস কোড লেখার একটি উন্নত পদ্ধতি সরবরাহ করা হয়। এর মাধ্যমে, আমরা অ্যাসিঙ্ক্রোনাস অপারেশনকে আরও সহজ এবং কোড পাঠযোগ্য করতে পারি। পরবর্তীতে, Async/Await এস6 এর সাথে আরও একটি শক্তিশালী বৈশিষ্ট্য হিসেবে যোগ করা হয়, যা Promises এর সাথে কাজ করে এবং অ্যাসিঙ্ক্রোনাস কোডের স্ট্রাকচার আরও পরিষ্কার ও সহজ করে তোলে।
Promises কী?
Promises অ্যাসিঙ্ক্রোনাস অপারেশন বা ফাংশনগুলির ফলাফলকে প্রতিনিধিত্ব করে। একটি Promise হলো একটি ওয়েব API বা কোনো ফাংশনের অ্যাসিঙ্ক্রোনাস কাজের জন্য যে অবস্থা থাকে তা ম্যানেজ করে।
Promise এর তিনটি অবস্থা থাকতে পারে:
- Pending (অপেক্ষমাণ): Promise এখনও সম্পন্ন হয়নি।
- Resolved (পূর্ণাঙ্গ): Promise সফলভাবে সম্পন্ন হয়েছে।
- Rejected (অগ্রাহ্য): Promise সফলভাবে সম্পন্ন হয়নি এবং ত্রুটি ঘটেছে।
Promise এর উদাহরণ
let promise = new Promise((resolve, reject) => {
let success = true;
if (success) {
resolve("Operation successful!");
} else {
reject("Operation failed!");
}
});
promise
.then(result => console.log(result)) // "Operation successful!"
.catch(error => console.log(error)); // "Operation failed!"
এখানে, resolve() ফাংশনটি Promise সফলভাবে সম্পন্ন হলে কল করা হয়, এবং reject() ফাংশনটি ত্রুটি হলে কল হয়। then() এবং catch() মেথড ব্যবহার করে আমরা Promise এর ফলাফল এবং ত্রুটিগুলি হ্যান্ডল করি।
Async/Await কী?
Async/Await হলো ES6 এর একটি ফিচার, যা Promises এর সাথে কাজ করে এবং অ্যাসিঙ্ক্রোনাস কোডকে সিঙ্ক্রোনাস কোডের মত দেখতে এবং ব্যবহার করতে সক্ষম করে। এটি কোডের স্ট্রাকচার সহজ এবং পাঠযোগ্য করে তোলে।
- Async: একটি ফাংশন যখন
asyncদিয়ে ডিফাইন করা হয়, তখন সেটি একটি Promise রিটার্ন করে। - Await:
awaitকিওয়ার্ডটি শুধুমাত্রasyncফাংশনের ভিতরে ব্যবহার করা যায় এবং এটি Promise সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করে।awaitPromise কে থামায় এবং ফলস্বরূপ, অ্যাসিঙ্ক্রোনাস অপারেশনকে সিঙ্ক্রোনাস অপারেশনের মত কাজ করায়।
Async/Await এর উদাহরণ
function fetchData() {
return new Promise((resolve) => {
setTimeout(() => {
resolve("Data fetched!");
}, 2000);
});
}
async function getData() {
let result = await fetchData();
console.log(result);
}
getData(); // "Data fetched!" (after 2 seconds)
এখানে, fetchData() ফাংশনটি একটি Promise রিটার্ন করে, যা 2 সেকেন্ড পর "Data fetched!" রিটার্ন করবে। getData() ফাংশনটি async দ্বারা ডিফাইন করা হয়েছে, এবং তার ভিতরে await কিওয়ার্ড ব্যবহার করে আমরা fetchData() এর ফলাফল পাওয়া পর্যন্ত অপেক্ষা করি।
Async/Await এবং Promises এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Promises | Async/Await |
|---|---|---|
| পদ্ধতি | .then() এবং .catch() ব্যবহার করা হয় | await দিয়ে Promise অপেক্ষা এবং async ফাংশন ব্যবহার |
| কোডের পাঠযোগ্যতা | কোড একটু বেশি জটিল হতে পারে | কোড আরও পরিষ্কার এবং সিঙ্ক্রোনাস মনে হয় |
| বিভিন্ন অপারেশন একসাথে করা | চেইনিং প্রয়োজন | একাধিক await ব্যবহার করে সহজে একাধিক অপারেশন করা যায় |
Multiple Promises with Async/Await
একাধিক Promise এর জন্য await ব্যবহার করা যেতে পারে, এবং এটি Promise.all() এর মতো সমানভাবে কাজ করবে, কিন্তু কোডটি আরও সহজ এবং পরিষ্কার হয়ে যাবে।
উদাহরণ:
function fetchData1() {
return new Promise((resolve) => setTimeout(() => resolve("Data 1"), 2000));
}
function fetchData2() {
return new Promise((resolve) => setTimeout(() => resolve("Data 2"), 3000));
}
async function getAllData() {
let data1 = await fetchData1();
let data2 = await fetchData2();
console.log(data1); // "Data 1"
console.log(data2); // "Data 2"
}
getAllData();
এখানে, await দিয়ে দুটি অ্যাসিঙ্ক্রোনাস অপারেশন ধারাবাহিকভাবে কার্যকর হবে। যদি আপনি চান যে অপারেশনগুলো একসাথে চলুক, তবে Promise.all() ব্যবহার করতে পারেন।
async function getAllData() {
let [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);
console.log(data1); // "Data 1"
console.log(data2); // "Data 2"
}
এখানে, Promise.all() এর মাধ্যমে দুটি Promise একসাথে চালানো হয়েছে, এবং await কিওয়ার্ডের মাধ্যমে আমরা উভয় ফলাফলই একসাথে পেয়েছি।
সারাংশ
- Promises অ্যাসিঙ্ক্রোনাস অপারেশন ম্যানেজ করতে ব্যবহৃত হয়, যেখানে সফল বা ব্যর্থ হওয়ার অবস্থার জন্য
resolveবাrejectব্যবহার করা হয়। - Async/Await এস6 এর একটি ফিচার, যা Promises এর সাথে ব্যবহৃত হয় এবং কোডকে সিঙ্ক্রোনাস ভাবে লেখার সুযোগ দেয়, ফলে কোড সহজ ও পরিষ্কার হয়।
- Async ফাংশন Promise রিটার্ন করে এবং Await Promise এর ফলাফল আসা পর্যন্ত অপেক্ষা করে।
Async/Await ব্যবহারের মাধ্যমে আপনি অ্যাসিঙ্ক্রোনাস কোডের পরিচালনা সহজভাবে করতে পারবেন, যা কোডের পাঠযোগ্যতাও বাড়ায়।
ES6 এ async এবং await এর মাধ্যমে asynchronous কোড লেখা আরও সহজ এবং পরিষ্কার হয়েছে। এগুলো Promise এর সাথে কাজ করে, কিন্তু এর মাধ্যমে callback function ব্যবহার ছাড়াই asynchronous কোড সহজভাবে লেখা সম্ভব। তবে, যখন asynchronous কোডে কোনো ভুল (error) ঘটে, তখন try এবং catch ব্লক ব্যবহার করে ত্রুটি পরিচালনা (error handling) করা হয়।
Async/Await এর মাধ্যমে Error Handling
async এবং await এর সাথে error handling করতে try/catch ব্লক ব্যবহার করা হয়। এই ব্লকটি Promise এর rejection বা অন্যান্য runtime errors ধরতে সাহায্য করে।
Async/Await: Basic Syntax
async ফাংশন Promise ফিরিয়ে দেয় এবং await কে ব্যবহার করে আপনি Promise এর ফলাফল (resolved value) পেতে পারেন।
উদাহরণ:
async function fetchData() {
let result = await fetch('https://jsonplaceholder.typicode.com/posts');
let data = await result.json();
console.log(data);
}
এখানে, await ফাংশন fetch() এবং result.json() এর সাথে কাজ করছে।
Error Handling in Async/Await
যখন asynchronous কোডে কোনো সমস্যা হয়, যেমন কোনো নেটওয়ার্ক সমস্যা বা API ত্রুটি (error), তখন সেই ভুল ধরা এবং প্রক্রিয়া করা খুবই গুরুত্বপূর্ণ। try/catch ব্লক ব্যবহার করে আপনি এই ত্রুটিগুলো ধরতে এবং সঠিকভাবে হ্যান্ডেল করতে পারেন।
উদাহরণ:
async function fetchData() {
try {
let response = await fetch('https://jsonplaceholder.typicode.com/posts');
// যদি Response ঠিক না থাকে, তবে error throw করা হবে
if (!response.ok) {
throw new Error('Network response was not ok');
}
let data = await response.json();
console.log(data);
} catch (error) {
// কোনো error ঘটলে, catch block এ চলে যাবে
console.error('There was an error!', error);
}
}
fetchData();
এখানে, try ব্লকে asynchronous কোড লেখা হয়েছে এবং catch ব্লকে সেই কোডে কোনো ভুল হলে (যেমন: নেটওয়ার্ক সমস্যা বা invalid response) error ধরা হবে।
Error Handling: Multiple Async Calls
যদি একাধিক asynchronous call থাকে এবং তাদের মধ্যে কোনো একটি call ত্রুটি (error) ঘটায়, তাহলে সেগুলোও try/catch ব্লকের মাধ্যমে নিরাপদভাবে হ্যান্ডেল করা যায়।
উদাহরণ:
async function fetchMultipleData() {
try {
let postsResponse = await fetch('https://jsonplaceholder.typicode.com/posts');
let usersResponse = await fetch('https://jsonplaceholder.typicode.com/users');
if (!postsResponse.ok) {
throw new Error('Failed to fetch posts');
}
if (!usersResponse.ok) {
throw new Error('Failed to fetch users');
}
let posts = await postsResponse.json();
let users = await usersResponse.json();
console.log('Posts:', posts);
console.log('Users:', users);
} catch (error) {
console.error('Error occurred:', error);
}
}
fetchMultipleData();
এখানে, দুইটি asynchronous call (posts এবং users) রয়েছে। যদি কোনো একটি call ত্রুটি (error) ঘটায়, তাহলে তা catch ব্লক দ্বারা হ্যান্ডেল করা হবে।
Error Handling with Async/Await in Parallel
কখনও কখনও, আমরা asynchronous calls গুলো parallel (একই সময়ে) চালাতে চাই, কিন্তু যখন কোনো একটা call ত্রুটি ঘটবে, তখন সেটা handle করা খুবই গুরুত্বপূর্ণ। Promise.all() ব্যবহার করা যেতে পারে multiple async calls কে parallel চালানোর জন্য।
উদাহরণ:
async function fetchDataInParallel() {
try {
const [posts, users] = await Promise.all([
fetch('https://jsonplaceholder.typicode.com/posts'),
fetch('https://jsonplaceholder.typicode.com/users')
]);
if (!posts.ok) {
throw new Error('Failed to fetch posts');
}
if (!users.ok) {
throw new Error('Failed to fetch users');
}
const postsData = await posts.json();
const usersData = await users.json();
console.log('Posts:', postsData);
console.log('Users:', usersData);
} catch (error) {
console.error('Error occurred:', error);
}
}
fetchDataInParallel();
এখানে Promise.all() ব্যবহার করা হয়েছে যাতে দুটি ফেচ অপারেশন একসাথে চলতে পারে। যদি কোনো একটি অপারেশন ত্রুটি ঘটায়, তখন catch ব্লক তা ধরবে।
Custom Error Handling
আপনি আপনার own custom error তৈরি এবং throw করতে পারেন যখন প্রয়োজন হয়। ES6 এ throw কিওয়ার্ড ব্যবহার করে custom error তৈরি করা যায়।
উদাহরণ:
async function fetchData() {
try {
let response = await fetch('https://jsonplaceholder.typicode.com/invalid-url');
if (!response.ok) {
throw new Error('Custom error: Unable to fetch data');
}
let data = await response.json();
console.log(data);
} catch (error) {
console.error(error.message); // "Custom error: Unable to fetch data"
}
}
fetchData();
এখানে, যদি fetch এর রেসপন্স সঠিক না হয়, তখন throw new Error() দিয়ে একটি কাস্টম error তৈরি করা হয়েছে।
উপসংহার
ES6 async এবং await এর মাধ্যমে asynchronous কোড লেখা আরও সহজ হয়েছে। এবং try/catch ব্লক ব্যবহার করে আপনি এর সাথে error handling করতে পারেন। এর মাধ্যমে asynchronous অপারেশনগুলো আরো কার্যকর এবং নিরাপদভাবে পরিচালিত হয়, এবং কোডের রিডেবিলিটি বাড়ে।
Read more