কলব্যাক ফাংশন হল এমন ফাংশন, যেগুলি অন্য ফাংশনের কাছে আর্গুমেন্ট হিসেবে পাঠানো হয়। এরপর কলব্যাক ফাংশনটি কল করে পরবর্তী একটি কাজ শুরু করা যায়। প্রায়ই কলব্যাক ব্যবহার করা হয় সম্পন্ন হওয়া কাজের ফলাফল সামলাতে, বা কোনো ইভেন্ট ঘটলে তা সামলাতে। কলব্যাক ফাংশন সিঙ্ক্রোনাস এবং অ্যাসিঙ্ক্রোনাস দুই ধরনের প্রোগ্রামিংয়েই ব্যবহার করা যায়।
const sideLength = 5;
// Caller function takes a callback function
function applySideLength(callback) {
return callback(sideLength);
}
// Callback must expect the possible argument from the calling function
function areaOfSquare(side) {
return side * side;
}
applySideLength(areaOfSquare); // => 25
আপনি কলব্যাকগুলিকে একটি ফাংশন এক্সপ্রেশন হিসেবেও লিখতে পারেন:
applySideLength(function squarePerimeter(side) {
return side * 4;
});
JavaScript-এ এটি একটি দরকারি প্যাটার্ন, কারণ JavaScript-কে ডিজাইন করা হয়েছে সিঙ্গেল-থ্রেডেড রানটাইম হিসেবে, যেখানে একসাথে কেবল একটি ফাংশন কল চালানো যায়। কোনো ফাংশন চলার সময়, ফাংশনটি রিটার্ন না করা পর্যন্ত রানটাইম অন্য ইভেন্টে সাড়া দিতে বা এক্সিকিউশন চালিয়ে যেতে পারে না।
অনেক API কল (I/O ফাংশন, টাইমার আর ইভেন্ট লিসেনার) অ্যাসিঙ্ক্রোনাস পদ্ধতি ব্যবহার করে চলতি ফাংশন কলটি কাজ শেষ হওয়া পর্যন্ত সরিয়ে রাখে। কাজ শেষ হলে একটি কলব্যাক ফাংশন মেসেজ কিউ-তে রাখা হয়, যাতে রানটাইম দুটি ফাংশন কলের মাঝখানে থাকার সময় সেই মেসেজগুলি কলব্যাক ফাংশনটি কল করে প্রসেস করা হয়।
কলব্যাক ফাংশন ব্যবহার করাও দরকারি, কারণ এগুলি নিজের ক্লোজার স্কোপের এমন ভ্যারিয়েবল ব্যবহার করতে পারে, যেগুলি সেই ফাংশনের কাছে পাওয়া যায় না, যেখানে পরে এটিকে কল করা হয়।
ইভেন্ট হ্যান্ডলার হল JavaScript-এ কলব্যাকের একটি কমন ব্যবহার। 'onload' বা 'onclick'-এর মতো ব্রাউজার ইভেন্ট হল এমন সিগন্যাল, যা ফাংশন কল হওয়ার ট্রিগার দিতে পারে। একটি DOM [Document Object Model অবজেক্টের addEventListener মেথড একটি কলব্যাক ফাংশন রেজিস্টার করে, যাতে কোনো ইভেন্ট ঘটেছে বলে সেটি "শুনলে" ফাংশনটি কল হয়।
document.addEventListener('onload', function () {
alert('The webpage has now been loaded');
});
Node.js-এ কলব্যাক ফাংশনগুলি প্রোগ্রামের প্রবাহ নিয়ন্ত্রণ করতে একটি কনভেনশন মেনে চলে। প্যাটার্নটি এমন: কলব্যাক ফাংশনের প্রথম আর্গুমেন্টে একটি Error বা null আসতে পারে; দ্বিতীয় ও পরের আর্গুমেন্টগুলিতে সেই ডেটা আসে, যা পাঠানোর জন্য কলিং ফাংশনটি তৈরি করা হয়েছে।
কোনো এরর ঘটলে দ্বিতীয় ও পরের আর্গুমেন্টগুলি নাও থাকতে পারে, তাই সেগুলি থাকবে ধরে নেওয়া আপনার জন্য নিরাপদ নয়।
function operation(a, b, callback) {
// Work ...
if (/* an error occurs */) {
return callback(new Error('An error occurred'))
}
// On success:
callback(null, data)
}
function callback(error, returnedData) {
if (error) {
// An error occurred, handle it here.
return
}
// No error occurred, continue with the returned data.
}
operation(1, 2, callback)
কন্ট্রোল ফ্লো সামলাতে অ্যাসিঙ্ক্রোনাস ফাংশন নিয়ে কাজ করার সময় আপনি প্রায়ই এই প্যাটার্নটি দেখতে পাবেন।
কমন Array ফাংশনগুলি তাদের আচরণ নির্ধারণ করতে কলব্যাক ফাংশন ব্যবহার করে:
Array.prototype.forEach:
একটি কলব্যাক নেয় এবং অ্যারের প্রতিটি এলিমেন্টে সেই কলব্যাক প্রয়োগ করে।
[1, 2, 3].forEach(function (element) {
doSomething(element);
});
// => doSomething() is invoked 3 times, once with each element
Array.prototype.map
একটি কলব্যাক নেয় এবং অ্যারের প্রতিটি এলিমেন্টে সেই কলব্যাক প্রয়োগ করে, ফলাফলটি দিয়ে একটি নতুন অ্যারে তৈরি করে।
[1, 2, 3].map(function (element) {
return element + 1;
});
// => [2, 3, 4]
Array.prototype.reduce
একটি কলব্যাক নেয় এবং অ্যারের প্রতিটি এলিমেন্টে সেই কলব্যাক প্রয়োগ করে, ফলাফলটি পরের ইনভোকেশনে এগিয়ে দেয়।
[1, 2, 3].reduce(function (runningSum, element) {
return runningSum + element;
}, 0);
// => 6