আমরা অনেক প্রোগ্রামার আছি যাদের asynchronous প্রোগ্রামিং এবং প্রমিজ নিয়ে তেমন খুব বেশি ধারনা নেই । তবে এটা এতটাও কঠিন না যে আমরা বুঝতে পারব না বা শিখে ফেলতে পারব না । সমস্যা হচ্ছে আমাদের যারা শেখায় তাদের এই বিষয়টা কঠিন করে বুঝানোর কারণে অনেক প্রোগ্রামর ভয় পেয়ে যায় । এবং কাজের কাজ চলার জন্য যতটুকই দরকার সেই কোডের সিনট্যাক্স মুখস্ত করে কাজ চালিয়ে নেয় ।
আজকে এই ভয় টা কিছুটা জয় করা জাঁক কয়েকটা কোড বোঝার মাধ্যমে ।
প্রথমে Promise নিয়ে কিছু কথা বলা যাক । Promise এটা অবজেক্ট । Promise মূলত ২ টা আর্গুমেন্ট পেয়ে থাকে । একটা resolve আর একটা reject . resolve মূলত Promise ফুলফিল্ড হওয়াকে বুঝায় । আর ফুলফিল্ড না হলে তাকে reject দিয়ে হেন্ডেল করতে পারি ।
const isResolved = true;
const promise = new Promise((resolve, reject) => {
if (isResolved) {
resolve("completed");
} else {
reject("message");
}
});
console.log(promise);
promise
.then((result) => {
console.log(result);
})
.catch((err) => {
console.log(err + "rejected");
});
এখন একটু আর কিছু উদাহরণ দেখে নেই । যেটা খুব কাজে লাগবে না তবে দেখে রাখা ভালো । --> আমরা একটা টেক্সটকে কিভাবে প্রমিসে কনভার্ট করতে পারি ?
const name = "rashedul"
const nameOfPromise = Promise.resolve(name)
console.log(nameOfPromise)
এটা হয়ত কিছুই তেমন বুঝা যাচ্ছে না , বুঝার সুবিধারতে এখানে একটা ইমেজ অ্যাড করা হল ।
এখন হয়ত খুব ভালো ভাবেই বুঝতে পারছেন যে কিভাবে কি কাজ হচ্ছে । এখন আমরা নেক্সট উদাহরণে চলে যাচ্ছি । যেটা আমরা ফাংশনের মাধ্যমে Promise কেস হেন্ডেল করা ।
function wait(ms) {
const promise = new Promise((resolve, reject) => {
setTimeout(resolve, ms);
});
return promise;
}
wait(200)
.then(() => {
console.log("done in 200 ms");
})
.catch((err) => {
console.log(err);
});
ex : ধরুন আমাদের এমন এটা কাজ করতে হবে যেটা promise এঁর মাধ্যমে । এবং কাজটা এমন যে , প্রথমে একটা API থেকে একটা ইউজারের ডাটা আসবে । সেট ইউজার এঁর ID এঁর ভিত্তিতে সেই ইউজার এঁর পোস্ট গুলো আনতে হবে । এবং সেই পোস্ট এঁর আন্ডারে যত কমেন্ট আছে সেগুলো আনতে হবে তাহলে আমরা কিভাবে এই কাজটা করেতে পারি ?
const get = (url) => Promise.resolve()
get('/users/userName=rashedul')
.then(user=>{
return get(`/posts/user_id=${user.id}`)
})
.then(posts=>{
const letestPosts = posts[0]
return get(`/comments?post_id=${letestPosts.id}`)
})
.catch(err=>{
console.log(err)
})
এইভাবে আমরা কাজটা করতে পারি । তবে এটা অনেক আগের সিনট্যাক্স এইভাবেই আগের জাভাস্ক্রিপ্ট এ কাজ করা হত । ২০১৫ এঁর মত থেকে কিছু আধুনিক জিনিস জাভাস্ক্রিপ্ট অ্যাড হয়েছে । যেটা আমরা asyncronus নামে চিনি । এখন আমরা এই প্রবলেমটা asyncronus প্রোগ্রামিং এঁর মাধ্যমে করে দেখব যে আমাদের প্রোগ্রামারদের কাজ কতটা সহজ হয়ে গেছে ।
তার আগে আমরা একটা ইমেজ দেখে আশি ।
এখানে একটা নরমাল ফাংশন undefined রিটার্ন করছে । আর একটা async ফাংশন একটা Promise রিটার্ন করছে । যেহেতু আমাদের async ফাংশন টা Promise রিটার্ন তাই আগের কাজটা আমরা async, await দিয়ে করে ফেলতে পারি ।
async function getData(userName){
try{
const mainUser = await get(`/users/userName=${userName}`)
const posts = await get(`/posts/user_id=${user.id}`)
const comments = await get(`/comments?post_id=${letestPosts.id}`)
const user = await get(`/users?userName=${comments[0].userName}`)
console.log(user)
}catch(err=>{
console.log(err)
})
}
getData("rashedul")