Skip to main content

Command Palette

Search for a command to run...

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

Published
3 min read
কলব্যাক ফাংশন - কি, কেন, কিভাবে?
A

I am a Frontend Web Developer. I work with ReactJS and NextJS. I also try to share my knowledge with the community.

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

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

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

এখানে ডাক দেয়াকে কলব্যাক হিসেবে ধরুন। আপনাকে দাঁড়িয়ে থাকতে হচ্ছে না। তার অর্ডার নেয়াও ব্লক হয়ে থাকছে না। 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)) লিখে রান করি তবে আর কোনো এরর পাবো না, আউটপুট হিসেবে ৯ পাবো।

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

More from this blog

How To Configure MUI Theme with Next.js App Router

আমরা সবাই জানি, নেক্সট জেএস তাদের অ্যাপ রাউটারকে স্টেবল করে দিয়েছে। এই কনসেপ্টটা ম্যাক্সিমাম মানুষের কাছে নতুন। আগে ছিল পেইজ রাউটার। যেটাতে আমরা অভ্যস্ত হয়ে আছি। কিন্তু এখন যদি আমরা অ্যাপ রাউটার নিয়ে কাজ করতে যাই তাহলে কিছুটা সমস্যার সম্মুখীন হতে পার...

Jun 24, 20234 min read600
How To Configure MUI Theme with Next.js App Router

Unit and Integration Testing with Vitest and React Testing Library

ধরুন আপনি একটা স্কুলে ভর্তি হতে চান। স্কুলে কি আপনি গিয়ে মাত্র ভর্তি হতে পারবেন? কখনই না। স্কুল কর্তৃপক্ষ আপনাকে বিভিন্নভাবে যাচাই করে নিবেন। আগের ক্লাসের মার্কশীট দেখতে চাইবেন, ছোটখাট টেস্ট নিবেন, সবকিছুতে যদি আপনি পাশ করেন তাহলেই আপনি সেই স্কুলে ভর...

May 31, 202312 min read80
Unit and Integration Testing with Vitest and React Testing Library

Thunder Client (Postman এর বিকল্প)

Introduction আজ আপনাদের এমন একটা টুলের সাথে পরিচয় করিয়ে দেবো যার নাম Thunder Client। এটা মূলত একটা ভিএস কোডের এক্সটেনশন। এটার মাধ্যমে এপিআই টেস্টের জন্য ব্যবহার করা হয়। Postman এর বিকল্প বলতে পারেন। এটার সুবিধা হলো এটা অনেক হালকা। এবং আপনার এডিটরেই আ...

Jul 6, 20223 min read380
Thunder Client (Postman এর বিকল্প)

Expression vs. Statement

Expression এবং Statement এর মধ্যে আমরা প্রোগ্রামাররা অনেক কনফিউশনে থাকি। এই আর্টিকেলের উদ্দেশ্য ছোট একটা ওভারভিউর মাধ্যমে বিষয়টা ক্লিয়ার করা। Expression and Statement এর মধ্যে বেসিক যে পার্থক্য সেটা হলো এক্সপ্রেশন দিন শেষে কিছু না কিছু রিটার্ন করে, ড...

Jun 21, 20222 min read323
Expression vs. Statement
A

Aditya's Blog

6 posts

I am a Frontend Web Developer. I work with ReactJS and NextJS. I also try to share my knowledge with the community.