TypeScript ফাংশন এবং কলব্যাকস ব্যবহারের ক্ষেত্রে JavaScript এর মতোই কাজ করে, তবে TypeScript স্ট্যাটিক টাইপিং এবং টাইপ সেফটি প্রদান করে, যা ফাংশন এবং কলব্যাকের ক্ষেত্রে আরও নির্ভরযোগ্য কোড তৈরি করতে সাহায্য করে। এই টিউটোরিয়ালে আমরা TypeScript এ ফাংশন তৈরি, টাইপ ডিফাইন করা, এবং কলব্যাক ফাংশন ব্যবহারের কৌশল নিয়ে আলোচনা করব।
ফাংশন কী?
ফাংশন একটি কোডের ব্লক যা একটি নির্দিষ্ট কাজ সম্পাদন করে। TypeScript এ ফাংশনগুলি function কীওয়ার্ড দিয়ে ডিফাইন করা হয় এবং আপনি এর প্যারামিটার এবং রিটার্ন টাইপও নির্দিষ্ট করতে পারেন।
TypeScript এ ফাংশন তৈরি
TypeScript এ একটি সাধারণ ফাংশন ডিফাইন করার সিনট্যাক্স নিম্নরূপ:
function add(a: number, b: number): number {
return a + b;
}
let result = add(5, 10);
console.log(result); // Output: 15
এখানে, add ফাংশনটি দুটি number টাইপের প্যারামিটার নেয় এবং একটি number টাইপের রিটার্ন মান প্রদান করে।
ফাংশন টাইপ
TypeScript এ আপনি ফাংশনের টাইপ ডিফাইন করতে পারেন। এটি ফাংশনের প্যারামিটার এবং রিটার্ন টাইপ উল্লেখ করার মাধ্যমে করা হয়।
ফাংশন টাইপ ডিফাইন করার উদাহরণ:
let multiply: (x: number, y: number) => number;
multiply = (x, y) => x * y;
console.log(multiply(2, 3)); // Output: 6
এখানে, multiply একটি ফাংশন টাইপ ভেরিয়েবল, যা দুটি number প্যারামিটার এবং একটি number রিটার্ন করে।
কলব্যাকস (Callbacks) কী?
কলব্যাক হলো এমন একটি ফাংশন যা অন্য একটি ফাংশন দ্বারা আর্গুমেন্ট হিসেবে পাস করা হয় এবং পরে সেই ফাংশনটি এক্সিকিউট করার সময় কল করা হয়। TypeScript এ কলব্যাক ফাংশনগুলি সাধারণত হাইয়ার-অর্ডার ফাংশন (Higher-order Functions) এর অংশ হিসেবে ব্যবহৃত হয়।
কলব্যাক ফাংশন ব্যবহার করলে, আপনি একটি ফাংশনের মধ্যে অন্য একটি ফাংশন পাস করতে পারবেন, যা নির্দিষ্ট সময় পরে বা কোনো নির্দিষ্ট ইভেন্ট ঘটলে চালু হবে।
TypeScript এ কলব্যাক ফাংশন ব্যবহার
উদাহরণ ১: একটি সাধারণ কলব্যাক ফাংশন
function greet(name: string, callback: (name: string) => void): void {
console.log("Hello, " + name);
callback(name);
}
function thankYou(name: string): void {
console.log("Thank you, " + name);
}
greet("John", thankYou); // Output: Hello, John
// Output: Thank you, John
এখানে, greet ফাংশন একটি callback ফাংশন নেয়, যা name আর্গুমেন্টটি পাস করে কল করা হয়।
উদাহরণ ২: কলব্যাক সহ অ্যারে ফাংশন
TypeScript এ কলব্যাক ফাংশন সাধারণত অ্যারে ম্যানিপুলেশনেও ব্যবহৃত হয়। যেমন map, filter, এবং forEach ইত্যাদি।
let numbers: number[] = [1, 2, 3, 4];
numbers.forEach((number) => {
console.log(number * 2); // Output: 2, 4, 6, 8
});
এখানে, forEach একটি কলব্যাক ফাংশন নেয় যা প্রতিটি উপাদানটির ওপর একটি নির্দিষ্ট কাজ (এখানে, গুণ করা) করে।
উদাহরণ ৩: কলব্যাক ফাংশন ও টাইপ
আপনি কলব্যাক ফাংশনের টাইপও স্পষ্টভাবে ডিফাইন করতে পারেন। এটি স্ট্যাটিক টাইপিংয়ের সুবিধা দেয় এবং ভুল টাইপ এড়িয়ে চলতে সাহায্য করে।
function processNumbers(arr: number[], callback: (num: number) => void): void {
for (let num of arr) {
callback(num);
}
}
processNumbers([1, 2, 3], (num) => {
console.log(num * 2); // Output: 2, 4, 6
});
এখানে, processNumbers ফাংশনটি একটি অ্যারে এবং একটি কলব্যাক ফাংশন নেয় যা প্রতিটি সংখ্যার ওপর একটি কাজ (এখানে, গুণ করা) সম্পাদন করে।
কলব্যাক ফাংশনগুলোর ব্যবহার ক্ষেত্রে সুবিধা
- অ্যাসিনক্রোনাস অপারেশন: কলব্যাক ফাংশন বিশেষ করে অ্যাসিনক্রোনাস অপারেশন যেমন, ইভেন্ট হ্যান্ডলিং, API কল, টাইমআউট, বা পিপলাইনের মধ্যে ব্যবহৃত হয়।
- কাস্টম লজিক: কলব্যাক ফাংশন আপনাকে নির্দিষ্ট লজিক নির্ধারণ করতে সাহায্য করে, যেমন অ্যারে বা স্ট্রিং ম্যানিপুলেশন, যেখানে কার্যক্রম নির্ভর করে অন্য একটি ফাংশনের আউটপুটের ওপর।
- ফাংশনাল প্রোগ্রামিং: কলব্যাক ফাংশন ফাংশনাল প্রোগ্রামিং ধারণার সাথে খুব ভালোভাবে কাজ করে, যেখানে আপনি একাধিক ফাংশনকে একসাথে চেইন করতে পারেন।
সারাংশ
TypeScript এ ফাংশন এবং কলব্যাকস ব্যবহার করা সহজ, এবং টাইপ সেফটি ব্যবহার করে আপনি ত্রুটি কমিয়ে আনতে পারেন। TypeScript এর স্ট্যাটিক টাইপিং ফিচারটি ফাংশনের আর্গুমেন্ট এবং রিটার্ন টাইপ স্পষ্টভাবে ডিফাইন করে, যার ফলে কোডটি আরও নির্ভরযোগ্য এবং ত্রুটিমুক্ত হয়।
ফাংশন টাইপিং এবং অ্যানোনিমাস ফাংশন TypeScript-এ খুবই গুরুত্বপূর্ণ কনসেপ্ট, যা আপনাকে ফাংশনের আর্গুমেন্ট, রিটার্ন টাইপ এবং ফাংশনের আচরণ স্পষ্টভাবে নির্ধারণ করতে সাহায্য করে। TypeScript-এর টাইপ সিস্টেমের শক্তি ফাংশনের টাইপিং এবং অ্যানোনিমাস ফাংশনের মাধ্যমে আরও বৃদ্ধি পায়।
১. ফাংশন টাইপিং (Function Typing)
TypeScript-এ ফাংশনের টাইপিং খুবই গুরুত্বপূর্ণ। ফাংশন টাইপিংয়ের মাধ্যমে আপনি ফাংশনের আর্গুমেন্ট এবং রিটার্ন টাইপ নির্ধারণ করতে পারেন। এটি কোডের সঠিকতা নিশ্চিত করতে সহায়ক এবং এটির মাধ্যমে টাইপ সম্পর্কিত ত্রুটি কমানো যায়।
উদাহরণ:
// ফাংশন টাইপিং
function add(a: number, b: number): number {
return a + b;
}
const result = add(5, 10); // Output: 15
এখানে, add ফাংশনটি দুটি number আর্গুমেন্ট নেয় এবং একটি number রিটার্ন করে। TypeScript এখানে টাইপ চেকিং করে নিশ্চিত করে যে ফাংশনটি সঠিকভাবে ব্যবহৃত হচ্ছে।
ফাংশন টাইপিংয়ের সঠিকতা:
- আপনি ফাংশনের আর্গুমেন্টগুলোর টাইপ এবং রিটার্ন টাইপ স্পষ্টভাবে নির্ধারণ করতে পারেন।
- এটি কোডকে টাইপ সেফ করে তোলে, যার ফলে ফাংশনটি নির্দিষ্ট ধরনের আর্গুমেন্ট গ্রহণ এবং নির্দিষ্ট ধরনের মান রিটার্ন করে।
২. অ্যানোনিমাস ফাংশন (Anonymous Function)
অ্যানোনিমাস ফাংশন হলো এমন একটি ফাংশন যা কোনো নাম ছাড়াই তৈরি হয় এবং একবার ব্যবহারের পর আর কোনো উদ্দেশ্যে সংরক্ষিত থাকে না। এই ধরনের ফাংশন সাধারণত কোডের মধ্যে সরাসরি ব্যবহার করা হয় এবং এগুলো ফাংশন এক্সপ্রেশন হিসেবেও পরিচিত।
TypeScript-এ অ্যানোনিমাস ফাংশন ব্যবহার করা সম্ভব এবং এতে টাইপিংও প্রয়োগ করা যেতে পারে।
উদাহরণ:
// অ্যানোনিমাস ফাংশন
const multiply = (a: number, b: number): number => {
return a * b;
};
console.log(multiply(2, 3)); // Output: 6
এখানে, multiply একটি অ্যানোনিমাস ফাংশন হিসাবে ডিফাইন করা হয়েছে যা number টাইপের দুটি আর্গুমেন্ট নেয় এবং number টাইপের রিটার্ন প্রদান করে। এই ধরনের ফাংশন Arrow Function আকারে ব্যবহার করা হয়।
৩. অ্যানোনিমাস ফাংশন টাইপিং
অ্যানোনিমাস ফাংশনের টাইপ নির্ধারণ করা TypeScript-এ খুবই গুরুত্বপূর্ণ, কারণ এতে আপনার কোডের সঠিকতা এবং টাইপ সেফটি বজায় থাকে। আপনি অ্যানোনিমাস ফাংশনের আর্গুমেন্ট ও রিটার্ন টাইপের জন্য টাইপ অ্যানোটেশন ব্যবহার করতে পারেন।
উদাহরণ:
// অ্যানোনিমাস ফাংশন টাইপিং
const sum: (a: number, b: number) => number = (a, b) => {
return a + b;
};
console.log(sum(5, 10)); // Output: 15
এখানে, sum একটি ফাংশন এক্সপ্রেশন হিসেবে ডিক্লেয়ার করা হয়েছে এবং তার টাইপ সাইনেচার (a: number, b: number) => number দ্বারা নির্ধারণ করা হয়েছে। এর মানে হলো, ফাংশনটি দুটি number আর্গুমেন্ট গ্রহণ করবে এবং একটি number রিটার্ন করবে।
৪. অ্যানোনিমাস ফাংশন ব্যবহার করে কলব্যাক ফাংশন
অ্যানোনিমাস ফাংশন সাধারণত কলব্যাক ফাংশন হিসেবে ব্যবহৃত হয়, যেখানে কোনো ফাংশনকে আর্গুমেন্ট হিসেবে অন্য ফাংশনে পাঠানো হয়। এই ধরনের ফাংশন ব্যবহার করে আপনি সহজেই অ্যাসিনক্রোনাস কার্যক্রম বা ইভেন্ট হ্যান্ডলিং করতে পারেন।
উদাহরণ:
function processNumbers(a: number, b: number, callback: (result: number) => void) {
const result = a + b;
callback(result);
}
processNumbers(3, 7, (result) => {
console.log("The result is:", result); // Output: The result is: 10
});
এখানে, processNumbers একটি ফাংশন যা callback ফাংশন হিসেবে একটি অ্যানোনিমাস ফাংশন গ্রহণ করছে। এই অ্যানোনিমাস ফাংশনটি কলব্যাক হিসেবে result প্রিন্ট করছে।
৫. ফাংশন টাইপিং: Optional এবং Default Parameters
TypeScript-এ ফাংশনের টাইপিংয়ের সময় আপনি অপশনাল প্যারামিটার এবং ডিফল্ট প্যারামিটারও ব্যবহার করতে পারেন। এই বৈশিষ্ট্যগুলো কোডকে আরও নমনীয় এবং শক্তিশালী করে তোলে।
Optional Parameters:
function greet(name: string, age?: number): string {
if (age) {
return `Hello ${name}, you are ${age} years old.`;
} else {
return `Hello ${name}!`;
}
}
console.log(greet("Alice")); // Output: Hello Alice!
console.log(greet("Bob", 30)); // Output: Hello Bob, you are 30 years old.
এখানে, age প্যারামিটারটি অপশনাল, যার মান দেয়া না হলে সেটি undefined হিসেবে ধরবে।
Default Parameters:
function greet(name: string, age: number = 25): string {
return `Hello ${name}, you are ${age} years old.`;
}
console.log(greet("Charlie")); // Output: Hello Charlie, you are 25 years old.
console.log(greet("David", 40)); // Output: Hello David, you are 40 years old.
এখানে, age প্যারামিটারটির জন্য ডিফল্ট মান দেওয়া হয়েছে। যদি আর্গুমেন্ট হিসেবে age প্রদান না করা হয়, তবে এটি ২৫ হিসেবে ব্যবহার হবে।
সারাংশ
TypeScript-এ ফাংশন টাইপিং এবং অ্যানোনিমাস ফাংশন ব্যবহার কোডের সঠিকতা এবং ফ্লেক্সিবিলিটি নিশ্চিত করতে সহায়ক। টাইপ অ্যানোটেশন দিয়ে ফাংশনের আর্গুমেন্ট এবং রিটার্ন টাইপ নির্দিষ্ট করা যায়, যা কোডের ত্রুটি কমাতে সাহায্য করে। অ্যানোনিমাস ফাংশন সাধারণত কলব্যাক ফাংশন হিসেবে ব্যবহৃত হয় এবং আর্গুমেন্ট হিসেবে পাঠানো হয়, যা অ্যাসিনক্রোনাস কার্যক্রম বা ইভেন্ট হ্যান্ডলিংয়ের জন্য বেশ কার্যকর।
TypeScript এ কলব্যাক ফাংশন এবং প্রমিসেস দুটি গুরুত্বপূর্ণ কনসেপ্ট যা অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ের জন্য ব্যবহৃত হয়। এগুলি আপনাকে কোডের কার্যকারিতা নিয়ন্ত্রণ করতে এবং অ্যাসিঙ্ক্রোনাস অপারেশন সম্পন্ন করার পর একটি নির্দিষ্ট কাজ করতে সহায়তা করে। এই লেখায় কলব্যাক ফাংশন এবং প্রমিসেস এর বিস্তারিত আলোচনা করা হবে।
১. কলব্যাক ফাংশন (Callback Functions)
কলব্যাক ফাংশন হল একটি ফাংশন যা অন্য একটি ফাংশনের আর্গুমেন্ট হিসেবে পাস করা হয় এবং সেই ফাংশনটি সম্পন্ন হওয়ার পর কলব্যাক ফাংশনটি চালানো হয়। এটি অ্যাসিঙ্ক্রোনাস কাজ করতে ব্যবহৃত হয়, যেমনঃ একটি HTTP রিকোয়েস্ট শেষ হওয়ার পর কোন কাজ করা।
উদাহরণ:
function fetchData(callback: (data: string) => void) {
setTimeout(() => {
callback("Data fetched successfully!");
}, 2000);
}
fetchData((data) => {
console.log(data); // আউটপুট: "Data fetched successfully!" ২ সেকেন্ড পর
});
এখানে, fetchData ফাংশনটি একটি কলব্যাক ফাংশন গ্রহণ করে এবং সেটি কিছু সময় পরে কল করে (এখানে setTimeout দিয়ে সিমুলেট করা হয়েছে)। যখন ডেটা ফেচ করা হয়, তখন কলব্যাক ফাংশনটি কাজ করে এবং ডেটা প্রিন্ট হয়।
বিশেষ লক্ষ্য:
- কলব্যাক ফাংশন সাধারনত
voidরিটার্ন টাইপের হয়, কারণ এটি সাধারণত শুধুমাত্র কোন কাজ সম্পন্ন করতে ব্যবহৃত হয়। - টাইপ নিরাপত্তার জন্য কলব্যাক ফাংশনের টাইপ নির্ধারণ করা গুরুত্বপূর্ণ।
২. প্রমিসেস (Promises)
প্রমিস হল একটি অ্যাসিঙ্ক্রোনাস অপারেশন যা ভবিষ্যতে কিছু মান রিটার্ন করবে। এটি একটি অবস্থা ধারণ করে, যা হতে পারে:
- Pending: প্রমিসটি এখনও পূর্ণ হয় নি।
- Resolved: প্রমিস সফলভাবে সম্পন্ন হয়েছে এবং মান রিটার্ন হয়েছে।
- Rejected: প্রমিসটি ব্যর্থ হয়েছে এবং ত্রুটি ঘটেছে।
প্রমিসেস অ্যাসিঙ্ক্রোনাস কাজের ফলাফলকে আরও সহজে পরিচালনা করতে সাহায্য করে।
উদাহরণ:
function fetchData(): Promise<string> {
return new Promise((resolve, reject) => {
setTimeout(() => {
const success = true; // সিমুলেট করা সফলতা
if (success) {
resolve("Data fetched successfully!");
} else {
reject("Failed to fetch data.");
}
}, 2000);
});
}
fetchData()
.then((data) => {
console.log(data); // আউটপুট: "Data fetched successfully!" ২ সেকেন্ড পর
})
.catch((error) => {
console.error(error); // যদি সমস্যা হয়, ত্রুটি দেখাবে
});
এখানে, fetchData ফাংশনটি একটি Promise রিটার্ন করে। এটি resolve বা reject এর মাধ্যমে প্রমিসের ফলাফল প্রদান করে। .then() মেথডটি প্রমিস সফল হলে চালিত হয় এবং .catch() মেথডটি প্রমিস ব্যর্থ হলে ত্রুটি ধরতে ব্যবহৃত হয়।
৩. অ্যাসিঙ্ক/অয়েট (async/await)
async/await হল JavaScript এবং TypeScript এর একটি সিনট্যাক্স যা প্রমিসেসের সাথে কাজ করার আরো সহজ এবং পরিষ্কার পদ্ধতি সরবরাহ করে। async ফাংশনটি একটি প্রমিস রিটার্ন করে এবং await আপনাকে প্রমিসের ফলাফলটি গ্রহণ করতে সক্ষম করে, যেন এটি সিঙ্ক্রোনাস কোডের মতো কাজ করে।
উদাহরণ:
async function fetchData(): Promise<string> {
return new Promise((resolve, reject) => {
setTimeout(() => {
const success = true;
if (success) {
resolve("Data fetched successfully!");
} else {
reject("Failed to fetch data.");
}
}, 2000);
});
}
async function getData() {
try {
const data = await fetchData();
console.log(data); // আউটপুট: "Data fetched successfully!" ২ সেকেন্ড পর
} catch (error) {
console.error(error); // ত্রুটি থাকলে এরকম আউটপুট হবে
}
}
getData();
এখানে fetchData ফাংশনটি একটি প্রমিস রিটার্ন করে, এবং getData ফাংশনে await ব্যবহার করে প্রমিসটি অপেক্ষা করে এবং তারপর ফলাফল গ্রহণ করে। try/catch ব্লক ব্যবহার করে আপনি ত্রুটি ধরতে পারেন।
৪. কলব্যাক বনাম প্রমিসেস
| বৈশিষ্ট্য | কলব্যাক | প্রমিসেস |
|---|---|---|
| প্রসেসিং | অ্যাসিঙ্ক্রোনাস অপারেশন সম্পন্ন হওয়ার পরে কলব্যাক ফাংশন কল হয়। | প্রমিস ভবিষ্যতে ফলাফল প্রদান করে এবং .then() বা .catch() দিয়ে পরিচালিত হয়। |
| কোডের পড়াশোনা | নেস্টেড কলব্যাক (Callback Hell) হয়ে যেতে পারে। | কোডটি পরিস্কার এবং সহজে বুঝতে পারা যায়। |
| এরি চেইনিং | চেইনিং করা কঠিন। | প্রমিসেস চেইনিং করে একাধিক অ্যাসিঙ্ক্রোনাস কাজ সোজা ভাবে সম্পন্ন করা যায়। |
৫. অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ে ব্যবহৃত অন্যান্য টুলস
TypeScript/JavaScript এ আরও কিছু টুল এবং লাইব্রেরি আছে যা কলব্যাক এবং প্রমিসেস ব্যবহারে সহায়ক হতে পারে:
- RxJS: রিঅ্যাকটিভ প্রোগ্রামিংয়ের জন্য ব্যবহৃত লাইব্রেরি।
- SetTimeout/SetInterval: নির্দিষ্ট সময় পর একটি ফাংশন কল করার জন্য।
- Event Listeners: DOM ইভেন্টগুলো অ্যাসিঙ্ক্রোনাসভাবে হ্যান্ডেল করতে।
সারাংশ
TypeScript এ কলব্যাক ফাংশন এবং প্রমিসেস আপনাকে অ্যাসিঙ্ক্রোনাস অপারেশন ম্যানেজ করতে সাহায্য করে। কলব্যাক ফাংশন সাধারণত একটি নির্দিষ্ট কাজ সম্পন্ন হওয়ার পর অন্য একটি ফাংশন কল করতে ব্যবহৃত হয়, যেখানে প্রমিসেস ভবিষ্যতে ফলাফল প্রদান করতে সক্ষম। async/await সিনট্যাক্স প্রমিসেসের ব্যবহারের কাজকে আরও সোজা এবং পরিষ্কার করে তোলে।
TypeScript, JavaScript এর উপর ভিত্তি করে কাজ করে, যা অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ের জন্য শক্তিশালী সমর্থন প্রদান করে। async/await একটি আধুনিক সিনট্যাক্স, যা অ্যাসিঙ্ক্রোনাস কোডকে আরো সহজ এবং পড়তে সহজ করে তোলে। এর সাহায্যে আপনি সাধারণ সিঙ্ক্রোনাস কোডের মতো অ্যাসিঙ্ক্রোনাস কোড লিখতে পারেন, তবে এটি থ্রেড ব্লকিং থেকে মুক্ত থাকে।
১. অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং (Asynchronous Programming)
অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং মূলত এমন একটি প্রোগ্রামিং পদ্ধতি যেখানে কোডের এক বা একাধিক অংশ একই সময়ে কার্যকর হতে পারে। এর মাধ্যমে আপনি I/O অপারেশন (যেমন ডাটাবেস কল, API রিকোয়েস্ট, ফাইল সিস্টেম অপারেশন ইত্যাদি) সম্পন্ন হওয়ার জন্য অপেক্ষা করতে না করে অন্যান্য কাজ করতে পারেন। এর ফলে অ্যাপ্লিকেশন দ্রুত এবং আরও কার্যকরভাবে কাজ করতে পারে।
JavaScript এবং TypeScript এ অ্যাসিঙ্ক্রোনাস কোড সাধারণত setTimeout(), Promises, এবং async/await ব্যবহার করে লেখা হয়।
২. Promises: অ্যাসিঙ্ক্রোনাস অপারেশন হ্যান্ডলিং
Promise হল একটি অবজেক্ট যা ভবিষ্যতে সম্পন্ন হতে যাওয়া একটি অ্যাসিঙ্ক্রোনাস অপারেশনকে প্রতিনিধিত্ব করে। এটি তিনটি অবস্থায় থাকতে পারে:
- Pending: অপারেশনটি এখনো সম্পন্ন হয়নি।
- Fulfilled: অপারেশনটি সফলভাবে সম্পন্ন হয়েছে।
- Rejected: অপারেশনটি ব্যর্থ হয়েছে।
উদাহরণ: Promise
function fetchData(): Promise<string> {
return new Promise((resolve, reject) => {
let success = true; // এটি একটি শর্ত যা সফল বা ব্যর্থ হওয়ার জন্য ব্যবহৃত হয়
setTimeout(() => {
if (success) {
resolve("Data fetched successfully!");
} else {
reject("Error fetching data.");
}
}, 2000);
});
}
fetchData().then((result) => {
console.log(result); // Output: Data fetched successfully!
}).catch((error) => {
console.error(error); // Output: Error fetching data.
});
এখানে:
fetchDataফাংশনটি একটিPromiseরিটার্ন করে, যা ২ সেকেন্ড পরে সফল বা ব্যর্থ হতে পারে।
৩. async/await: অ্যাসিঙ্ক্রোনাস কোড লেখার আধুনিক উপায়
async/await হল একটি সিনট্যাক্স যা Promise এর উপর ভিত্তি করে কাজ করে, তবে কোডটি আরও পরিষ্কার এবং সহজে পড়া যায়। async ফাংশন একটি Promise রিটার্ন করে এবং await কিওয়ার্ডটি ব্যবহার করে আপনি Promise এর রেজাল্টের জন্য অপেক্ষা করতে পারেন, কোড ব্লক থামানো ছাড়াই।
৩.১. async ফাংশন
async কিওয়ার্ডটি ফাংশনকে একটি অ্যাসিঙ্ক্রোনাস ফাংশন হিসেবে চিহ্নিত করে। এটি একটি Promise রিটার্ন করে, যা সফল বা ব্যর্থ হওয়ার পর .then() বা .catch() মেথডের মাধ্যমে হ্যান্ডল করা যায়।
উদাহরণ: async ফাংশন
async function fetchData(): Promise<string> {
return "Data fetched successfully!";
}
fetchData().then((result) => {
console.log(result); // Output: Data fetched successfully!
});
এখানে:
fetchDataফাংশনটি একটিasyncফাংশন, যা সরাসরি একটিPromiseরিটার্ন করে এবং সেইPromiseকে.then()ব্যবহার করে হ্যান্ডল করা হয়।
৩.২. await কিওয়ার্ড
await কিওয়ার্ডটি async ফাংশনের মধ্যে ব্যবহার করা হয় এবং এটি Promise এর রেজাল্টের জন্য অপেক্ষা করে। যখন await একটি Promise পায়, এটি সে পর্যন্ত অপেক্ষা করে যতক্ষণ না Promise রেজল্ট হয় এবং তার পরে পরবর্তী লজিক চলে।
উদাহরণ: await কিওয়ার্ড ব্যবহার করা
async function fetchData(): Promise<string> {
let result = await new Promise<string>((resolve, reject) => {
setTimeout(() => resolve("Data fetched successfully!"), 2000);
});
return result;
}
async function displayData() {
let data = await fetchData();
console.log(data); // Output: Data fetched successfully!
}
displayData();
এখানে:
fetchDataফাংশনটিawaitকিওয়ার্ড ব্যবহার করে একটিPromiseরেজল্ট হতে অপেক্ষা করছে এবং তারপরে রিটার্ন হচ্ছে।displayDataফাংশনটিawaitব্যবহার করেfetchDataফাংশনের রেজল্টের জন্য অপেক্ষা করছে।
৪. Error Handling with async/await
async/await ব্যবহারের সময় ত্রুটি হ্যান্ডলিং করার জন্য আপনি try/catch ব্লক ব্যবহার করতে পারেন। যদি কোনো অ্যাসিঙ্ক্রোনাস অপারেশন ত্রুটি তৈরি করে, তাহলে সেটি catch ব্লকের মধ্যে ধরা যাবে।
উদাহরণ: Error Handling with async/await
async function fetchData(): Promise<string> {
let success = false;
if (!success) {
throw new Error("Failed to fetch data.");
}
return "Data fetched successfully!";
}
async function displayData() {
try {
let data = await fetchData();
console.log(data);
} catch (error) {
console.error(error.message); // Output: Failed to fetch data.
}
}
displayData();
এখানে:
fetchDataফাংশনটি একটি ত্রুটি ছুঁড়ে ফেলছে যদিsuccessভেরিয়েবলটিfalseহয়।displayDataফাংশনটিtry/catchব্লক ব্যবহার করে ত্রুটিকে হ্যান্ডল করছে।
৫. async/await এর সুবিধা
- ক্লিন এবং পড়তে সহজ কোড:
async/awaitব্যবহার করে অ্যাসিঙ্ক্রোনাস কোড লেখা অনেক সহজ এবং সিঙ্ক্রোনাস কোডের মতো দেখতে হয়। - এখনও পুরোপুরি অ্যাসিঙ্ক্রোনাস: কোড সিঙ্ক্রোনাস দেখালেও আসলে এটি অ্যাসিঙ্ক্রোনাসভাবেই কাজ করে, অর্থাৎ এটি মূল থ্রেড ব্লক করে না।
- ত্রুটি হ্যান্ডলিং সহজ:
try/catchব্লক ব্যবহার করে সহজে ত্রুটি হ্যান্ডলিং করা যায়।
৬. সারাংশ
TypeScript এ async/await অ্যাসিঙ্ক্রোনাস কোড লেখার জন্য একটি আধুনিক এবং কার্যকর পদ্ধতি। async ফাংশন একটি Promise রিটার্ন করে এবং await কিওয়ার্ড দিয়ে আপনি Promise এর রেজল্টের জন্য অপেক্ষা করতে পারেন। এটি অ্যাসিঙ্ক্রোনাস কোড লেখাকে সিঙ্ক্রোনাস কোডের মতো আরও পরিষ্কার এবং সহজ করে তোলে।
TypeScript আপনাকে টাইপ সেফ কলব্যাকস (callbacks) এবং প্রমিসেস (Promises) ব্যবহারের সুবিধা প্রদান করে, যা কোডের সঠিকতা নিশ্চিত করতে এবং ডেভেলপমেন্টের সময় বিভিন্ন ধরনের ভুল কমাতে সাহায্য করে। কলব্যাকস এবং প্রমিসেস এমন দুইটি কৌশল যা অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ে ব্যবহৃত হয়, এবং TypeScript এর টাইপ সিস্টেমের মাধ্যমে এসবের জন্য টাইপ সেফটি নিশ্চিত করা যায়।
১. টাইপ সেফ কলব্যাকস (Type-safe Callbacks)
কলব্যাক ফাংশনগুলি এমন ফাংশন, যেগুলি অন্য ফাংশনকে আর্গুমেন্ট হিসেবে পাঠানো হয় এবং নির্দিষ্ট সময়ের পর কল করা হয়। টাইপ সেফ কলব্যাকস নিশ্চিত করে যে আপনার কলব্যাক ফাংশন সঠিক টাইপের আর্গুমেন্ট গ্রহণ করছে এবং সঠিক রিটার্ন টাইপ প্রদান করছে।
কলব্যাক ফাংশনের উদাহরণ:
function fetchData(url: string, callback: (data: string) => void): void {
setTimeout(() => {
callback("Data fetched from " + url);
}, 1000);
}
fetchData("https://api.example.com", (data) => {
console.log(data); // "Data fetched from https://api.example.com"
});
এখানে fetchData ফাংশনে একটি কলব্যাক ফাংশন পাস করা হয়েছে, যা string টাইপের data আর্গুমেন্ট গ্রহণ করে এবং void রিটার্ন করে। TypeScript এর টাইপ সিস্টেম এই কলব্যাকের আর্গুমেন্ট এবং রিটার্ন টাইপের সঠিকতা নিশ্চিত করে।
টাইপ সেফ কলব্যাক সিস্টেমের উন্নত উদাহরণ:
আপনি যদি একটি জেনেরিক টাইপ ব্যবহার করতে চান, তাহলে কলব্যাকের জন্য একটি টাইপ অ্যালিয়াস বা ইন্টারফেস তৈরি করতে পারেন। এটি কোডকে আরও নমনীয় এবং পুনঃব্যবহারযোগ্য করে তোলে।
type Callback<T> = (data: T) => void;
function processData<T>(data: T, callback: Callback<T>): void {
callback(data);
}
processData(42, (data) => {
console.log(`Received data: ${data}`); // "Received data: 42"
});
processData("Hello, world!", (data) => {
console.log(`Received data: ${data}`); // "Received data: Hello, world!"
});
এখানে Callback<T> টাইপটি জেনেরিকভাবে তৈরি করা হয়েছে, যা যে কোনো টাইপের data গ্রহণ করতে পারে। processData ফাংশনটিও T টাইপের data গ্রহণ করে এবং তার সাথে টাইপ সেফ কলব্যাক ব্যবহার করে।
২. টাইপ সেফ প্রমিসেস (Type-safe Promises)
Promises JavaScript এবং TypeScript এ অ্যাসিঙ্ক্রোনাস অপারেশনগুলি পরিচালনা করার জন্য ব্যবহৃত হয়। TypeScript-এ, আপনি প্রমিসেসের টাইপ সেফটি নিশ্চিত করতে পারেন যাতে প্রমিস রেজাল্ট এবং এর পরবর্তী .then() বা .catch() ব্লকগুলিতে টাইপ ত্রুটি না হয়।
বেসিক প্রমিস উদাহরণ:
function fetchData(url: string): Promise<string> {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Data fetched from " + url);
}, 1000);
});
}
fetchData("https://api.example.com")
.then((data) => {
console.log(data); // "Data fetched from https://api.example.com"
})
.catch((error) => {
console.error(error);
});
এখানে, fetchData ফাংশনটি একটি Promise<string> রিটার্ন করছে, যা string টাইপের ডেটা সম্বলিত প্রমিস রিটার্ন করবে। .then() ব্লকটি সঠিকভাবে টাইপ করা হয়েছে এবং এখানে কোনো টাইপ ত্রুটি হবে না।
জেনেরিক প্রমিস উদাহরণ:
আপনি যদি টাইপ সেফ প্রমিস ব্যবহার করতে চান যা বিভিন্ন টাইপের ডেটার জন্য কাজ করতে পারে, তবে আপনি জেনেরিক টাইপ ব্যবহার করতে পারেন:
function fetchData<T>(url: string): Promise<T> {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(`Data fetched from ${url}` as unknown as T);
}, 1000);
});
}
fetchData<string>("https://api.example.com")
.then((data) => {
console.log(data); // "Data fetched from https://api.example.com"
})
.catch((error) => {
console.error(error);
});
এখানে, fetchData ফাংশনটি জেনেরিকভাবে ডেটার টাইপ T ব্যবহার করে, যা প্রমিস রেজাল্টে টাইপ সেফটি বজায় রাখে।
টাইপ সেফ প্রমিস এবং চেইনিং
TypeScript-এ প্রমিস চেইনিংয়ের সময় টাইপ সেফটি বজায় রাখতে পারেন:
function processData(value: number): Promise<string> {
return new Promise((resolve, reject) => {
if (value < 0) {
reject("Negative number not allowed");
} else {
resolve(`Processed value: ${value}`);
}
});
}
processData(42)
.then((result) => {
console.log(result); // "Processed value: 42"
})
.catch((error) => {
console.error(error);
});
এখানে, processData ফাংশনটি Promise<string> রিটার্ন করে এবং .then() ব্লকে টাইপ সেফ ব্যবহার নিশ্চিত করে। catch ব্লকেও টাইপ সেফটি বজায় রাখা হয়েছে।
৩. কলব্যাকস এবং প্রমিসেসের একত্রিত ব্যবহার
আপনি কলব্যাক এবং প্রমিসেস একসাথে ব্যবহার করতে পারেন, যেমন অ্যাসিঙ্ক্রোনাস কলব্যাকস। উদাহরণস্বরূপ, একটি প্রমিস রিটার্ন করা ফাংশনে কলব্যাক ব্যবহারের উদাহরণ:
function fetchData(url: string): Promise<string> {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(`Data fetched from ${url}`);
}, 1000);
});
}
function processData(callback: (data: string) => void): void {
fetchData("https://api.example.com")
.then((data) => {
callback(data); // কলব্যাকে টাইপ সেফ ডেটা পাঠানো হচ্ছে
})
.catch((error) => {
console.error(error);
});
}
processData((data) => {
console.log(data); // "Data fetched from https://api.example.com"
});
এখানে, fetchData একটি প্রমিস রিটার্ন করে এবং processData ফাংশন কলব্যাকের মাধ্যমে ডেটা প্রক্রিয়া করছে।
৪. সারাংশ
TypeScript-এ টাইপ সেফ কলব্যাকস এবং প্রমিসেস ব্যবহার করে আপনি অ্যাসিঙ্ক্রোনাস কোডে টাইপ সঠিকতা নিশ্চিত করতে পারেন। কলব্যাকস ব্যবহার করে সঠিক আর্গুমেন্ট এবং রিটার্ন টাইপ নিশ্চিত করা সম্ভব, এবং প্রমিসেস ব্যবহারের মাধ্যমে আপনি অ্যাসিঙ্ক্রোনাস অপারেশনগুলি সঠিকভাবে টাইপ করে ত্রুটি কমাতে পারেন। জেনেরিক টাইপস ব্যবহার করে আপনি আরও নমনীয় এবং পুনঃব্যবহারযোগ্য কলব্যাকস এবং প্রমিসেস তৈরি করতে পারবেন।
Read more