কলব্যাক ফাংশন হলো এমন ফাংশন, যেগুলো আর্গুমেন্ট হিসেবে পাঠানো হয়। এই প্রোগ্রামিং প্যাটার্নটি সিঙ্ক্রোনাস ও অ্যাসিঙ্ক্রোনাস দুই ধরনের প্রোগ্রামিংয়েই পরপর একগুচ্ছ ফাংশন কল তৈরি করে। একটি কলব্যাক ফাংশন লেখা আর একটি ফাংশন লেখা একই ব্যাপার; তবে কলব্যাক ফাংশনটিকে অবশ্যই কল করা ফাংশনটি যে সিগনেচার নির্ধারণ করেছে তার সাথে মিলতে হবে।
const squareLength = 5;
// Caller function takes a callback function
function applyToSquare(callback) {
return callback(squareLength);
}
// Callback must expect the possible argument from the calling function
function areaOfSquare(number) {
return number * number;
}
applyToSquare(areaOfSquare); // => 25
আপনি চাইলে ফাংশন এক্সপ্রেশন, অ্যানোনিমাস ফাংশন এক্সপ্রেশন বা অ্যারো ফাংশন এক্সপ্রেশন হিসেবেও কলব্যাক লিখতে পারেন:
applyToSquare(function squarePerimeter(side) {
return side * 4;
});
applyToSquare(function (side) {
return side * 4;
});
applyToSquare((side) => {
return side * 4;
});
আপনি আপনার গ্রাহকদের জন্য মুদি দোকান থেকে টাটকা ফল অর্ডার করার একটি নতুন অনলাইন পোর্টাল তৈরি করছেন। মুদি দোকানটির একটি API আছে, যা ব্যবহার করে আপনার গ্রাহকদের কাঙ্ক্ষিত ফল মজুত আছে কি না তা দেখতে পারেন। মুদি দোকানের API-এর সাথে কাজ করার জন্য আপনাকে ফাংশনের একটি ছোট লাইব্রেরি তৈরি করতে হবে।
অর্ডার সফল হলে পোর্টালটির উচিত আপনার গ্রাহককে জানানো। onSuccess কলব্যাক ফাংশনটি ডিফাইন করুন, যেটি তখন কল করা হবে যখন মুদি দোকানে পর্যাপ্ত ফল মজুত থাকার কারণে অর্ডারটি সফল হয়। এই ফাংশনের উচিত ইমপোর্ট করা notify ফাংশনটি কল করা এবং { message: 'SUCCESS' } পাস করা, যাতে আপনার গ্রাহক জানতে পারেন যে তাঁর অর্ডারটি সফল হয়েছে।
onSuccess();
// => `notify` called with `{ message: 'SUCCESS' }`
অর্ডার ব্যর্থ হলে পোর্টালটির উচিত আপনার গ্রাহককে জানানো। onError কলব্যাক ফাংশনটি ডিফাইন করুন, যেটি তখন কল করা হবে যখন মুদি দোকানের কাছে ওই ফল মজুত নেই বা কোনো এরর হয়েছে বলে অর্ডারটি ব্যর্থ হয়। এই ফাংশনের উচিত ইমপোর্ট করা notify ফাংশনটি কল করা এবং { message: 'ERROR' } পাস করা, যাতে আপনার গ্রাহক জানতে পারেন যে তাঁর অর্ডারটি ব্যর্থ হয়েছে।
onError();
// => `notify` called with `{ message: 'ERROR' }`
ফলের অর্ডার দেওয়া হয় মুদি দোকানের API-এর মাধ্যমে, প্রদত্ত order ফাংশনের সাহায্যে। এই ফাংশনটি তিনটি আর্গুমেন্ট গ্রহণ করে: একটি কোয়েরি, যাতে অনুরোধ করা ফলের variety ও quantity থাকে; একটি কলব্যাক ফাংশন, যা অর্ডার সফল হলে কল করা হয়; এবং একটি কলব্যাক ফাংশন, যা অর্ডারে এরর হলে কল করা হয়।
আপনি আপনার কোডবেসকে সম্ভাব্য বাহ্যিক পরিবর্তন থেকে আলাদা রাখতে চান এবং সিদ্ধান্ত নেন যে order ফাংশনের কলটি orderFromGrocer নামের একটি নতুন ফাংশনের ভেতরে মোড়ানো হবে। orderFromGrocer ফাংশনটি ইমপ্লিমেন্ট করুন, যা মুদি দোকানের API order ফাংশনটি কল করে একটি অর্ডার দেওয়ার চেষ্টা করে; খেয়াল রাখুন যেন orderFromGrocer-এ পাস করা আর্গুমেন্টগুলো API কলটিতে পাঠানো হয়।
কোয়েরিটি একটি অবজেক্ট-এর রূপ নেয়:
const query = {
variety: string,
quantity: number,
};
orderFromGrocer(
{ variety: 'pear', quantity: 12 },
exampleSuccessCallback,
exampleErrorCallback,
);
// => `order` was called with the query and the callbacks
এখন আপনার গ্রাহকরা আপনার পোর্টালের মাধ্যমে ফলের অর্ডার দিতে পারেন। তবে আপনি লক্ষ করছেন যে আপনার কোডবেসের অনেক জায়গায় আপনি orderFromGrocer ফাংশনটি কল করছেন, আর প্রতিবারই আর্গুমেন্ট হিসেবে একটি query এবং দুটি callback ফাংশন পাস করতে হচ্ছে। কোড রিফ্যাক্টর করার একটি সুযোগ দেখে আপনার মনে হয়, শুধু প্রয়োজনীয় ফলের variety ও quantity পাস করেই অর্ডার দেওয়া গেলে সেটি আরও সহজ হতো। postOrder হেল্পার ফাংশনটি ডিফাইন করুন, যা আর্গুমেন্ট হিসেবে variety ও quantity নেয় এবং মুদি দোকানে একটি অর্ডার দেওয়ার চেষ্টা করে।
postOrder('peach', 100);
// => order placed for 100 peaches
Exercism-এ সাইন আপ করুন, JavaScript ট্র্যাকের 37টি কনসেপ্ট159টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।