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

কলব্যাক ফাংশন বুঝার জন্য আগে নিচের কোড টি ভাল ভাবে বুঝার চেষ্টা করি। 

function myFirst() {
    console.log("Hello")
  }

  function mySecond() {
    console.log("Goodbye");
  }
  myFirst();
  mySecond();

এই কোডটিতে প্রথমে myFirst(); তার পরে mySecond(); রান হবে

 অর্থাৎ যেটি আগে কল করা হবে সেটি আগে Execute হবে। একটার

 Execution শেষ না হওয়া পর্যন্ত আরেকটি Execute হবে না। এটাকে

 আমরা বলব Synchronization অর্থাৎ Sequentially Execute হবে। 

function myFirst() {
    console.log("Hello");
    mySecond();
  }

  function mySecond() {
    console.log("Goodbye");
  }
  myFirst();

আমরা উপরের কোডটিকে এভাবে লিখতে পারি। তাতে কি হবে

 আমরা একটা ফাংশন কল করে আরেকটা ফাংশন আপনাআপনি

 কল হচ্ছে । নিচের ফাংশনটি একটি  হায়ার অর্ডার ফাংশন এক্ষানে

 একটি কলব্যাক ফাংশন আর্গুমেন্ট আকারে নেয়া হয়েছে । 

function add(a,bcallback) {
    
    callback(a+b)
}
function print(value) {
    console.log('sum of a+b = '+ value)
}
add(5,7print)

এবার নিচের আরেকটি উদাহরণ লক্ষ্য করি। এটাও হায়ার অর্ডার

 ফাংশন যেটা কিনা একটা ফাংশন রিটার্ন করবে । 

function mulliplication(a) {
    
   return function (x) {
       return x*a
   }
}
let double = mulliplication(2)
console.log(double(5))

যখন আমরা mulliplication(2) ফাংশন কল করালাম তখন এটি  

function (x) {
}

টিকে রিটার্ন করল এবং এটি let double variable আসাইন হল। তখন double varible ফাংশন হয়ে গেল। কারন আমরা জানি ফাংশনকে Variable আসাইন করলে সেটিও ফাংশন হয়ে যায়। এবার double function আমরা 5 pass করলাম  তাহলে 5*2 = 10 হবে। 

জাভাস্ক্রিপ্ট মুলত Synchronizaion এটাকে Asynchronization করার জন্য অর্থাৎ অনেকগুল ফাংশন একই সাথে Execute করার আবার এভাবেও বলতে পারি আমাদের যখন যেমন ইচ্ছে মত ফাংশন Execution control করব এ জন্য setTimeout ফাংশন ব্যাবহার করা হয়। আর এই ফাংশনটি একটি ফাংশন নেয় আর্গুমেন্ট হিসেবে । এজন্য setTimeout ফাংশনটি একটি হায়ার অর্ডার ফাংশন । কলব্যাক ফাংশনের মানে এক কথায় এটা এমন একটা ফাংশন যেটা আরেকটা ফাংশন এক্সিকিউট হওয়ার পর এক্সিকিউট হয়। আর এজন্যেই এটার নাম কলব্যাক ফাংশন।

const getVarC = (callback=> {
    setTimeout(function() {
       console.log('A Function that takes some time');
       callback();
    }, 3000)
 }
 
 const printSomethingC = () => {
    console.log('Another Function');
 }
 getVarC(printSomethingC);


এখন এখানে আমাদের কি সমস্যা হতে পারে সেটা আমরা জানি।

 আমরা যদি কোনো ডাটা রিমোট কোনো সার্ভার থেকে কোথাও

 দেখাতে চাই, তাহলে জাভাস্ক্রিপ্ট এর অ্যাসিনক্রোনাস আচরনের

 কারণে ডাটা রিমোট সার্ভার থেকে আসার আগেই ডাটা দেখানোর

 লাইনে চলে যাবে। আর সেখানে যেহেতু ডাটা এখনো আসে নাই তাই

 যেরকমটা চাচ্ছিলাম সেরকম ফলাফল দেখাবে না। এররও আসতে

 পারে। আর এখানেই কলব্যাক ফাংশনের খেলা।

কলব্যাকের ফাংশনের সংজ্ঞা থেকে আমরা জেনেছিলাম এটা

 আরেকটা ফাংশন এক্সিকিউট হলে পরেই এক্সিকিউট হয়। আর তাই

 আমরা এখানে এই টেকনিকটা ইউজ করে এরকম পৃথক পৃথকভাবে

 দুইটা ফাংশন লিখেও কলব্যাকের মাধ্যমে ঠিক যেসময় ফাংশনটাকে

 কল করা দরকার সেসময়েই করতে পারবো

আমরা এখানে আমাদের মেইন ফাংশন কলের ভিতরে আর্গুমেন্ট হিসেবে আমাদের ফাংশনটাকে পাস করে দিলাম। আর সেটা পরে ঠিক যেখানে দরকার সেখানেই কল করলাম। এখানে এই printSomething()ফাংশনটাই কলব্যাক ফাংশন হয়ে গেলো। এটা আমাদের মনের মতো ফলাফল দিবে। মানে একটার পরে আরেকটা। এটা ঠিকই ৩ সেকেন্ড ওয়েট করবে তারপর ফলাফল দিবে। কিন্তু সিরিয়াল মেইন্টেইন করে। প্রথমে প্রমিস শেষ হবে, সেখান থেকে ডাটা আসবে, তারপর কলব্যাক ফাংশন রান করবেঃ