অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং (Async Programming)
সমস্যা: জাভাস্ক্রিপ্ট হলো সিঙ্গেল-থ্রেডেড (The Problem: JavaScript Is Single-Threaded)
জাভাস্ক্রিপ্ট একটি সিঙ্গেল-থ্রেডে বা এক লাইন ধরে কাজ করে — অর্থাৎ এটি একবারে কেবল একটি কাজই করতে পারে। কিন্তু যদি কোনো কাজে অনেক সময় লাগে, যেমন ধরুন সার্ভার থেকে ডেটা আনা, কোনো ফাইল পড়া বা টাইমারের জন্য অপেক্ষা করা — তখন কী হবে? জাভাস্ক্রিপ্ট যদি প্রতিটি কাজের জন্য বসে বসে অপেক্ষা করতে থাকে, তবে আপনার পুরো অ্যাপটিই হ্যাঙ বা ফ্রিজ (freeze) হয়ে যাবে।
এর সমাধান কী? অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং (Asynchronous programming)। বসে বসে অপেক্ষা করার বদলে জাভাস্ক্রিপ্ট বলে, "কাজটি শুরু করে দাও, আর শেষ হলে আমাকে জানিও — ততক্ষণে আমি অন্য কাজগুলো করতে থাকি।" ব্যাপারটি অনেকটা চায়ের দোকানে চা অর্ডার করার মতো — আপনি নিশ্চয়ই শুধু খাবারের অপেক্ষায় হেঁশেলের দরজায় দাঁড়িয়ে থাকেন না। আপনি বরং আপনার টেবিলে বসে বন্ধুদের সাথে গল্পগুজব করেন, আর চা তৈরি হয়ে গেলে দোকানদার বা বয় তা আপনার টেবিলে এনে দেয়।
জাভাস্ক্রিপ্টে অ্যাসিন্ক বা async-এর বিবর্তন কয়েক বছর ধরেই হয়েছে: কলব্যাক (callbacks) (পুরোনো উপায়) → প্রমিস (Promises) (আগের চেয়ে ভালো উপায়) → async/await (সবচেয়ে পরিষ্কার ও আধুনিক উপায়)।
কলব্যাক — বহুল প্রচলিত উপায় (Callbacks — The Original Approach)
প্রমিস — একটি অপেক্ষাকৃত ভালো উপায় (Promises — A Better Way)
একটি প্রমিস (Promise) হলো এমন একটি অবজেক্ট যা এমন একটি ভ্যালুর প্রতিনিধিত্ব করে যার অস্তিত্ব এখনও তৈরি হয়নি। এটিকে একটি গিফট কার্ডের সাথে তুলনা করতে পারেন — যা ভবিষ্যতে আপনাকে কিছু দেওয়ার একটি প্রতিশ্রুতি (promise) দেয়। একটি প্রামিস তিনটি অবস্থার যেকোনো একটিতে থাকতে পারে:
- পেন্ডিং বা অপেক্ষমাণ (Pending) — কাজ বা অপারেশনটি এখনও চলছে
- ফুলফিলড বা সম্পন্ন (Fulfilled) — কাজটি সফলভাবে শেষ হয়েছে (আপনি চাইলে এখন ফলাফলটি দেখতে পারেন)
- রিজেক্টেড বা বাতিল (Rejected) — কাজটি ব্যর্থ হয়েছে (আপনি এররটি বা ভুলটি দেখতে পারেন)
সফল হলে সেটি হ্যান্ডল করার জন্য আপনি .then() ব্যবহার করতে পারেন এবং এরর বা ভুলের ক্ষেত্রে .catch() ব্যবহার করতে পারেন। সবচেয়ে মজার ব্যাপার হলো, প্রমিসগুলোকে চেইন (chained) বা একসাথে জোড়া দিয়ে যুক্ত করা যায়, ফলে আপনি ওই নেস্টেড কলব্যাকের (nested callback) দুঃস্বপ্ন থেকে বেঁচে যান।
প্রমিস তৈরি এবং চেইন করা (Creating & Chaining Promises)
Async/Await — আধুনিক পদ্ধতি (Async/Await — The Modern Way)
async/await মূলত প্রমিসের ওপর তৈরি একটি সিনট্যাকটিক সুগার (syntactic sugar), যা অ্যাসিন্ক বা async কোডগুলোকে দেখতে এবং কাজ করতে অনেকটাই সিঙ্ক্রোনাস (synchronous) কোডের মতো মনে করিয়ে দেয়। একটি async ফাংশন সবসময় একটি প্রমিস রিটার্ন করে। এর ভেতরে আপনি await ব্যবহার করে কোডের এক্সিকিউশন বা চলা আপাতত থামিয়ে রাখতে পারেন, যতক্ষণ পর্যন্ত না প্রমিসটি সম্পন্ন হয় বা সেটল (settle) করে।
এটিকে চায়ের দোকানের সেই উদাহরণের মতো করে ভাবলে এমনটা দাঁড়ায়: "আমি আমার সিঙ্গারার জন্য অপেক্ষা করছি (await)। এরপর আমি আমার চায়ের জন্য অপেক্ষা করি (await)। তারপর আমি বিলের জন্য অপেক্ষা করি (await)।" প্রতিটি ধাপ আগের ধাপটি শেষ হওয়ার জন্য অপেক্ষা করে, কিন্তু দোকানের অন্যান্য কাজ তার নিজস্ব গতিতেই চলতে থাকে।
Async/Await এবং Fetch API
ছোট কুইজ
পড়া চালিয়ে যান