জাভাস্ক্রিপ্টে প্রমিস হেলের সমস্যা
আপনি ইতিমধ্যেই জানেন যে কলব্যাক হেলের সমস্যা সমাধানের জন্যই প্রমিস তৈরি করা হয়েছিল। যাইহোক, সময়ের সাথে সাথে দেখা গেল যে প্রমিসও জটিল কোড তৈরি করতে সক্ষম। এই সমস্যাটি সাদৃশ্য দ্বারা নামকরণ করা হয়েছে promise hell।
আসুন উদাহরণের মাধ্যমে এই সমস্যাটি দেখি
কোড। ধরুন আমাদের কাছে একটি ফাংশন আছে getSmth,
যেটি একটি প্যারামিটার নেয় এবং ফলাফল প্রদান করে
এই প্যারামিটারের উপর নির্ভর করে:
function getSmth(num) {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(num * num), 1000)
});
}
এই ক্ষেত্রে আমরা একটি দরকারী অপারেশন অনুকরণ করছি (উদাহরণস্বরূপ, সার্ভার থেকে ডেটা পাওয়া)। অনুকরণ হিসাবে আমরা কেবল একটি সংখ্যা পাস করি এবং এক সেকেন্ড পরে আমরা ফেরত দিই এই সংখ্যার বর্গ।
এখন আমাদের ফাংশনটি ব্যবহার করা যাক
getSmth অন্য একটি ফাংশনের ভিতরে:
function func() {
getSmth(2).then(res => {
console.log(res); // 4 প্রদর্শন করবে
});
}
func();
প্রথম সমস্যা
একের পর এক অনেকগুলি কনস্ট্রাকশন
then কোড বুঝতে অসুবিধা সৃষ্টি করে:
function func(){
getSmth(2).then(res1 => {
// কিছু করুন
}).then(res2 => {
// কিছু করুন
}).then(res3 => {
// কিছু করুন
}).then(res4 => {
// কিছু করুন
}).then(res5 => {
// কিছু করুন
}).then(res6 => {
// কিছু করুন
});
}
func();
দ্বিতীয় সমস্যা
অন্য ধরনেরও একটি সমস্যা আছে। এখন ধরুন আমরা আমাদের ফাংশনটি দুইবার ব্যবহার করতে চাই, তারপর ফলাফল যোগ করুন। ফলস্বরূপ আমাদের এইরকম কোড হবে:
function func() {
getSmth(2).then(res1 => {
getSmth(3).then(res2 => {
console.log(res1 + res2); // 13 প্রদর্শন করবে
});
});
}
func();
ইতিমধ্যেই কলব্যাক হেলের কথা মনে করিয়ে দেয়, তাই না? আরও একটি ফাংশন কল যোগ করা যাক - কোডটি হবে আরও খারাপ:
function func() {
getSmth(2).then(res1 => {
getSmth(3).then(res2 => {
getSmth(4).then(res3 => {
console.log(res1 + res2 + res3);
});
});
});
}
func();
অবশ্যই, Promise.all ব্যবহার করা যেতে পারে:
function func() {
Promise.all([getSmth(2), getSmth(3), getSmth(4)]).then(res => {
console.log(res[0] + res[1] + res[2]);
});
}
func();
যাইহোক, আমরা কি একই জিনিস পেয়েছি? না! প্রথম ক্ষেত্রে, প্রতিটি নতুন ফাংশন অপেক্ষা করে পূর্ববর্তী প্রমিসের সমাপ্তির জন্য, এবং দ্বিতীয় ক্ষেত্রে - সমস্ত প্রমিস একই সাথে কার্যকর করা হয়। এই পার্থক্য গুরুত্বপূর্ণ হবে সেই ক্ষেত্রে যখন আমরা পরবর্তী ফাংশনে পাঠাতে চাই পূর্ববর্তীটির কল:
function func() {
getSmth(2).then(res1 => {
getSmth(res1).then(res2 => {
getSmth(res2).then(res3 => {
console.log(res3);
});
});
});
}
func();