কলব্যাক ফাংশন - কি, কেন, কিভাবে?

কলব্যাক ফাংশন - কি, কেন, কিভাবে?

কলব্যাক ফাংশন কি?

ধরুন আপনি কোনো রেস্টুরেন্টে খেতে গেলেন। সেই রেস্টুরেন্টে সেলফ সার্ভিস অর্থাৎ আপনাকে কাউন্টারে গিয়ে অর্ডার করতে হবে এবং আপনাকে কাউন্টার থেকে গিয়ে খাবার নিয়ে আসতে হবে। আপনি খাবার অর্ডার করে কি দাঁড়িয়ে থাকবেন কাউন্টারে? কখনই না। আপনি এসে আপনার সিটে বসবেন। খাবার হলে ওরা আপনাকে ডাক দিবে। আপনি গিয়ে খাবার নিয়ে আসবেন। এখন পুরো প্রসেসকে একটি ফাংশন হিসেবে কল্পনা করুন। তাহলে তার স্টেপ কি রকম হবে তা একটু আমরা দেখি -

- অর্ডার নেয়া
- পেমেন্ট নেয়া
- খাবার তৈরি করা
- আপনাকে ডাক দেয়া।

এখানে ডাক দেয়াকে কলব্যাক হিসেবে ধরুন। আপনাকে দাঁড়িয়ে থাকতে হচ্ছে না। তার অর্ডার নেয়াও ব্লক হয়ে থাকছে না। Asynchronous ওয়েতে কিন্তু কাজ হয়ে যাচ্ছে। যখন খাবার রেডি হচ্ছে তখন সে আপনাকে কলব্যাক করছে। এর মধ্যে আপনি বসে আপনার কাজ করতে পারছেন। সেও তার অর্ডার নেয়ার কাজ চালিয়ে যাচ্ছে। একইভাবে কলব্যাক ফাংশন মানে হলো একটা ফাংশনের মধ্যে আরেকটা ফাংশন আর্গুমেন্ট আকারে পাস করা এবং সেই ফাংশনের মধ্যে যখন প্রয়োজন হবে তখন কলব্যাক ফাংশনটি কল করা। জাভাস্ক্রিপ্টে এই কলব্যাক ফাংশন অনেকের কাছে কনফিউজিং মনে হয়। বিশেষ করে যারা বিগিনার তাদের কাছে তো বটেই। আশা করবো এই আর্টিকেল পড়ার পর আপনাদের কনফিউশন কিছুটা হলেও দূর হবে। চলুন কিছু উদাহরণ দিয়ে বুঝানোর চেষ্টা করি। নিচের কোডটি খেয়াল করুন।

function func1 (cb) {
    console.log('Before callback');
    cb();
    console.log('After Callback');
}

function func2 () {
    console.log('I am callback');
}

func1(func2);
/*
Before callback
I am callback
After Callback
*/

এখানে খেয়াল করে দেখুন প্রথমে কল হচ্ছে Before Callback , এরপর কল হচ্ছে I am callback , সবশেষে কল হচ্ছে After Callback। অর্থাৎ আমরা একটা ফাংশনকে আরেকটা ফাংশনের প্যারামিটার হিসেবে পাস করে দিতে পারছি। সেটা যখন প্রয়োজন হচ্ছে তখন কল হচ্ছে প্রথম ফাংশনের মধ্যে। কারো জন্য কাউকে অপেক্ষা করে থাকতে হচ্ছে না। এটাই মূলত কলব্যাক ফাংশন। আমরা func2 না বানিয়ে সরাসরিও কল করতে পারতাম। সেটা কিভাবে চলুন দেখি।

function func1 (cb) {
    console.log('Before callback');
    cb();
    console.log('After Callback');
}

func1(function () {
    console.log('I am callback');
});
/*
Before callback
I am callback
After Callback
*/

আরো কিছু উদাহরণ

আমরা নিচের উদাহরণটি লক্ষ্য করি একটু।

function add(a, b, cb) {
    const sum = a + b;
    return cb(sum);
}

function double(num) {
    return num * 2;
}

function minusOne(num) {
    return num - 1;
}

console.log(add(4, 6, double)); // 20
console.log(add(4, 6, minusOne)); // 9
console.log(add(3, 6, Math.sqrt)); // 3

এখানে আমরা একটা add ফাংশন বানিয়েছি। এরপর সেখানে যে যোগফল পাচ্ছি তা দিয়ে আমরা কলব্যাক ফাংশনের মাধ্যমে নতুন কোনো আউটপুট রিটার্ন করছি। দুইটা ফাংশন বানিয়ে নিলাম নাম্বার ডাবল করার জন্য এবং নাম্বার থেকে এক বিয়োগ করার জন্য। এরপর আমরা add(4, 6, double) কল করলে আমাদের আউটপুট আসছে 20। প্রথম দুইটা প্যারামিটার ৪ এবং ৬ যোগ হয়ে হবে ১০। এরপর আমাদের কলব্যাক ফাংশন হিসেবে double পাস করার কারণে ঐ যোগফল ডাবল হয়ে ২০ হয়ে গেছে। একইভাবে পরেরটাতে এক বিয়োগ হয়ে ৯ হয়েছে। এরপর আমরা জাভাস্ক্রিপ্টের একটি বিল্টইন মেথড ব্যবহার করেছি কলব্যাক হিসেবে। সেক্ষেত্রে ৩ এবং ৬ এর যোগফলকে যদি Math.sqrt এর মাধ্যমে রুট করি আমাদের আউটপুট আসবে ৩। আমরা যখন অ্যারের বিভিন্ন মেথড যেমন forEach, map, filter ইত্যাদি ব্যবহার করি তখনও কিন্তু প্যারামিটার হিসেবে আমরা কলব্যাক ফাংশন পাস করি। তার মানে জাভাস্ক্রিপ্ট কলব্যাক কতটা গুরুত্বপূর্ণ তা আমরা বুঝতে পারছি।

অপশনাল কলব্যাক

এখন আপনারা যদি console.log(add(3, 6)) লিখে রান করান একটি এরর আসবে। কারণ আপনি কলব্যাক ফাংশন পাস করেন নি। যদি আমরা শুধু আউটপুটটাই চাই, কলব্যাক ফাংশনকে অপশনাল হিসেবে রাখতে চাই তবে কিভাবে করতে পারি? চলুন দেখি।

function add(a, b, cb) {
    if (cb === undefined) {
        return a + b;
    } else {
        return cb(a + b);
    }
}

যদি কলব্যাক পাস করা না হয় তবে তা undefined হিসেবে গণ্য হবে। যদি তা হয় তবে শুধু নাম্বার দুইটার যোগফল রিটার্ন করবে। এবার যদি আমরা console.log(add(3, 6)) লিখে রান করি তবে আর কোনো এরর পাবো না, আউটপুট হিসেবে ৯ পাবো।

আশা করি আপনারা কলব্যাক কি, কেন লাগে এর গুরত্ব বুঝতে পেরেছেন। কলব্যাক খুবই গুরুত্বপূর্ণ জাভাস্ক্রিপ্টে। এটা বুঝা খুবই দরকার।