5.2 কিভাবে অ্যাসিঙ্ক্রোনাস জাভাস্ক্ৰিপ্ট হ্যান্ডেল করবেন
জাভাস্ক্রিপ্টে অ্যাসিঙ্ক্রোনাস কোড লেখার তিনটি উপায় আছে, কলব্যাক, প্রমিজ এবং অ্যাসিঙ্ক/এওয়েট। চলুন একটি একটি করে আলোচনা করা যাক।
কলব্যাক:
কলব্যাক ফাংশনের মানে এক কথায় এটা এমন একটা ফাংশন যেটা আরেকটা ফাংশন এক্সিকিউট হওয়ার পর এক্সিকিউট হয়। আর এজন্যেই এটার নাম কলব্যাক ফাংশন। আমরা জাভাস্ক্রিপ্টে Higher Order Function এর কথা জানি। যেখানে একটা ফাংশন আরেকটা ফাংশন return করতে পারে আবার একই সাথে একটা ফাংশন আর্গুমেন্ট হিসেবে আরেকটা ফাংশনকেও নিতে পারে। যখনি এরকম একটা ফাংশন আরেকটা ফাংশনকে আর্গুমেন্ট হিসেবে নেয়, তখনি আমরা সেই আর্গুমেন্টে যাওয়া ফাংশনটাকে কলব্যাক ফাংশন বলি।
মাঝেমধ্যে আমরা আমাদের কোডের সিকুয়েন্স নিয়ন্ত্রণ করতে চাই, তখন আমরা খুব সহজেই কলব্যাক ফাংশন ব্যবহার করতে পারি। নিচের কোডটি খেয়াল করি, আমরা কলব্যাক ফাংশন ব্যবহার করে খুব সহজেই আগে যোগের কাজ শেষ করে তারপর আউটপুট দেখাচ্ছি।
খুবই সহজ একটি উদাহরণ। কিন্তু কলব্যাকের মুল কাজ হল জাভাস্ক্রিপ্টের অ্যাসিনক্রোনাস আচরণ নিয়ন্ত্রণ করা। আমরা জাভাস্ক্রিপ্ট এর অ্যাসিনক্রোনাস আচরণের কথা জানি। জাভাস্ক্রিপ্ট কোনো কাজ করতে সময় লাগলে সেখানে অপেক্ষা না করে পরের কোডে চলে যায়। নিচের কোডটি খেয়াল করিঃ
উপরে যদিও ১ম ফাংশন প্রথমে কল করা হয়েছে, কিন্তু অ্যাসিনক্রোনাস আচরণের জন্য আগে ২য় ফাংশন কল হবে।
কলব্যাক ফাংশনের সংজ্ঞা থেকে আমরা জেনেছিলাম এটা আরেকটা ফাংশন এক্সিকিউট হলে পরেই এক্সিকিউট হয়। আর তাই আমরা এখানে এই টেকনিকটা ইউজ করে এরকম পৃথক পৃথকভাবে দুইটা ফাংশন লিখেও কলব্যাকের মাধ্যমে ঠিক যেসময় ফাংশনটাকে কল করা দরকার সেসময়েই করতে পারবো।
আমরা এখানে আমাদের মেইন ফাংশন কলের ভিতরে আর্গুমেন্ট হিসেবে আমাদের ফাংশনটাকে পাস করে দিলাম। আর সেটা পরে ঠিক যেখানে দরকার সেখানেই কল করলাম। এটা আমাদের মনের মতো ফলাফল দিবে। মানে একটার পরে আরেকটা। এটা ঠিকই ৩ সেকেন্ড ওয়েট করবে তারপর ফলাফল দিবে। কিন্তু সিরিয়াল মেইন্টেইন করে।
প্রমিজ:
জাভাস্ক্রিপ্ট এর অ্যাসিনক্রোনাস আচরণ সম্পর্কে আমরা জানি। প্রমিসের কাজ হচ্ছে এ ধরনের অ্যাসিনক্রোনাস অপারেশনকে হ্যান্ডল করা। এখন আমরা রিমোট একটা সার্ভারের উপর অপারেশন চালাচ্ছি, কিন্তু ডাটা না আসা পর্যন্ত কিন্তু আমরা বলতে পারি না সে অপারেশন সফল হবে না বিফলে যাবে। আর মূলত এইসব হ্যান্ডল করার জন্যেই প্রমিস কাজ করে। আমাদের বেশিরভাগ ক্ষেত্রেই প্রমিস হ্যান্ডেল করতে হয়। প্রমিসের সিনট্যাক্স অনেকটা এইরকম হয়ে থাকে।
এখন প্রমিসের আবার ৩ ধরণের স্টেট হতে পারে, যেমনঃ
- Pending
- Fulfilled
- Rejected
Pending অবস্থায় ফলাফল undefined, Fulfilled অবস্থায় ফলাফল একটি ভ্যালু, এবং Rejected অবস্থায় ফলাফল একটি error অবজেক্ট।
প্রমিসের কাজ শেষ হবার পর তার Fulfilled বা রিজেক্টেড হয়ে কি ভ্যালু নিয়ে আসলো তা জানার জন্য আমরা .then ব্যবহার করে থাকি। নিচের কোডটি লক্ষ্য করুন।
async এবং await:
async এবং await প্রমিস লিখতে খুবই সহজ করে। async একটি ফাংশন দিয়ে প্রমিস রিটার্ন করে এবং await একটি ফাংশনকে প্রমিসের জন্য অপেক্ষা করায়। একটা প্রমিস হ্যান্ডেল করার পর এটার ভিতরে কলব্যাক ফাংশন কল করতে হয়। আবার সেই কলব্যাক ফাংশনের ভিতরে প্রমিস থেকে আসা ডাটাগুলো অ্যাক্সেস করতে হয়। এভাবে একটার পর একটার ভিতরে গিয়ে গিয়ে এভাবে আমাদের অপারেশনগুলো চালাতে হয় শুধুমাত্র জাভাস্ক্রিপ্ট এর অ্যাসিনক্রোনাস আচরণের কারণে।
জাভস্ক্রিপ্ট-এ মূলত প্রমিস হ্যান্ডেলের জন্যই async আর await এর পরিচয় করিয়ে দেওয়া হয়েছে। যেখানেই আপনি এরকম অ্যাসিনক্রোনাস কোডকে সিনক্রোনাস আচরণ করাতে চান সেখানেই এগুলো ব্যবহার করতে পারবেন। তবে এখানে কিছু নিয়ম কানুন আছে। আপনাকে async এই কীওয়ার্ডটা ব্যবহার করতে হবে ফাংশনের সাথে। আপনি যে কোডগুলোকে সিনক্রোনাস আচরণ করাতে চাচ্ছেন সেগুলো সবগুলো একটা ফাংশনের ভিতরে ঢুকিয়ে সেই ফাংশনের নামের আগে জাস্ট এভাবে async কীওয়ার্ডটা লাগিয়ে দিবেনঃ
এখানে লক্ষ্য করে দেখুন আমি অ্যাসিনক্রোনাস কলের ঠিক পরের লাইনেই আমাদের প্রমিস থেকে আসা ডাটা প্রিন্ট করে দিয়েছি। হ্যা এখানেই async আর await এর ম্যাজিক। এটা আমাদের অ্যাসিনক্রোনাস কোডকে সিনক্রোনাস আচরণ করতে সাহায্য করে যাতে আমাদের আর কলব্যাকে হেলে পড়তে না হয়। আমরা একদম লাইন বাই লাইন ইন্সট্রাকশন দিয়েই ডাটা উদ্ধার করতে পারবো।
এখন যদি প্রমিস রিজেক্টেড হয় তাহলে? হ্যা তাহলে আমরা try catch ব্লক দিয়েই আমরা আমাদের এই এরর হ্যান্ডল করতে পারবো।
- একটি callback function হল একটি ফাংশন যা একটি argument হিসাবে অন্য ফাংশনে পাস করা হয়।
-
function greet() {console.log(“Hello VIVASOFT 2”);}function sayHello(name) {console.log(“Hello” + ” “ + name);}setTimeout(greet, 2000);sayHello(“VIVASOFT 1”);
- Callback Hell অথবা Christmas Tree Problem
- উপরোক্ত Callback Hell সমস্যার সমাধান আমরা Promise ব্যবহার করে করব। প্রথমে addPromise নামের একটি function লিখি যেটি Promise return করে। যদি কোন error না হয় তাহলে পরবর্তী then কল হবে।
- Callback Hell অথবা Christmas Tree সমস্যার সমাধান আমরা async / await ব্যবহার করার মাধ্যমেও করতে পারি। নিচের কোডটুকু লক্ষ্য করি।
- একটি function লিখ যেটি একটা সংখ্যা ইনপুট হিসেবে নিবে এবং একে অন্য একটি function এর ভেতর callback আকারে পাঠিয়ে কল করবে এবং নিম্নোক্ত ফলাফল দেখাবে।
123
- একটি callback hell এর উদাহরণ লিখ।
- কি কি উপায়ে callback hell সমস্যার সমাধান করা যায় উল্লেখ করুন।
- নিম্নোক্ত কোডটিকে কিভাবে optimize করা যেতে পারে?
- নিম্নোক্ত কোডটিকে async/await ব্যবহার করে কিভাবে optimize করা যেতে পারে?