JavaScript-এ প্রমিস পরিচিতি
আপনি ইতিমধ্যেই জানেন যে অ্যাসিঙ্ক্রোনাস কাজে কলব্যাক মডেল ব্যবহার করলে সহজেই ক্যালব্যাক হেল পরিস্থিতির সৃষ্টি হয়। তাই JavaScript-এ একটি নতুন মডেল চালু করা হয়েছে যার নাম প্রমিস (promise)। আসুন এই মডেলটি শিখি।
একটি প্রমিস হল একটি অবজেক্ট, যার প্যারামিটার হিসেবে একটি ফাংশন পাঠানো হয়, যার ভিতরে আমাদের অ্যাসিঙ্ক্রোনাস কোড রাখতে হয়:
javascriptlet promise = new Promise(function() {
// অ্যাসিঙ্ক্রোনাস কোড
});
আপনি দেখতে পাচ্ছেন, আমি প্রমিস সহ অবজেক্টটি
promise ভেরিয়েবলে সংরক্ষণ করেছি। কোডের অন্য কোনো স্থানে
আমি এই ভেরিয়েবলে then মেথড প্রয়োগ করতে পারি, এটির মধ্যে একটি ফাংশন
পাস করে যা এই প্রমিস তৈরির সময় লেখা অ্যাসিঙ্ক্রোনাস কোড শেষ হওয়ার পরে
নির্বাহ হওয়ার কথা:
javascriptpromise.then(function() {
// অ্যাসিঙ্ক্রোনাস কোড শেষ হলে নির্বাহ হবে
});
শব্দগুলো জটিল শোনাচ্ছে, তাই আসুন একটি উদাহরণ দেখি। ধরা যাক আমার কাছে এইরকম একটি অ্যাসিঙ্ক্রোনাস কোড আছে:
javascriptsetTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
ধরা যাক আমি এর জন্য অ্যাসিঙ্ক্রোনাসিটির আমাদের মূল
সমস্যাটি সমাধান করতে চাই: টাইমার ট্রিগার হওয়ার পরে কিছু কোড
নির্বাহ করা। একই সময়ে
আমি এই কোডটি টাইমারের ভিতরেই রাখতে চাই না
এবং চাই যে কোনোভাবে result ভেরিয়েবলে আমার লেখা ফলাফলটি
এই কোডে পৌঁছাক।
মোটামুটিভাবে, আমরা পূর্ববর্তী পাঠগুলোতে
কলব্যাক এবং সাবস্ক্রিপশনের মাধ্যমে এই সমস্যার সমাধান করেছি।
আসুন এখন দেখি কিভাবে প্রমিস ব্যবহার করে এটি করা যায়।
প্রথমে আমাদের অ্যাসিঙ্ক্রোনাস কোডটি একটি প্রমিসের মধ্যে মোড়াতে হবে:
javascriptlet promise = new Promise(function() {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
});
যাইহোক, এটি যথেষ্ট নয়। আমাদের স্পষ্টভাবে নির্দেশ করতে হবে যে আমাদের অ্যাসিঙ্ক্রোনাস কোডটি শেষ হয়েছে। এতে আমাদের সাহায্য করবে একটি বিশেষ সমাপ্তি ফাংশন, যা স্বয়ংক্রিয়ভাবে ফাংশনের প্রথম প্যারামিটারে আসে যদি এটি উল্লেখ করা হয়:
javascriptlet promise = new Promise(function(resolve) { // প্যারামিটার উল্লেখ করি
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
});
সমাপ্তি ফাংশন ব্যবহার করে আমরা স্পষ্টভাবে প্রমিসকে নির্দেশ দিতে পারি যে অ্যাসিঙ্ক্রোনাস কোড শেষ হয়েছে। এর জন্য আমাদের প্রয়োজনীয় স্থানে এই ফাংশনটি কল করতে হবে:
javascriptlet promise = new Promise(function(resolve) {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
resolve(); // প্রমিস শেষ করছি
}, 3000);
});
একই সময়ে, আমরা যদি অ্যাসিঙ্ক্রোনাস কোডের কোনো ফলাফল বাইরে পাঠাতে চাই, সেটি আমাদের সমাপ্তি ফাংশনের প্যারামিটার হিসেবে পাঠাতে পারি:
javascriptlet promise = new Promise(function(resolve) {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
resolve(result); // ফলাফল পাঠাচ্ছি
}, 3000);
});
অবশ্যই, মধ্যবর্তী ভেরিয়েবল বাদ দেয়া সম্ভব:
javascriptlet promise = new Promise(function(resolve) {
setTimeout(function() {
resolve([1, 2, 3, 4, 5]);
}, 3000);
});
এখন আমরা অন্য কোনো স্থানে আমাদের প্রমিসের
then মেথডটি কল করতে পারি:
javascriptpromise.then(function() {
// প্রমিস শেষ হলে ট্রিগার হবে
});
প্রমিসের কাজের ফলাফল ফাংশনের প্রথম প্যারামিটারে চলে আসবে, যদি আমরা সেটি নির্দিষ্ট করতে চাই:
javascriptpromise.then(function(result) {
console.log(result); // ফলাফলের অ্যারে আউটপুট করবে
});
একটি প্রমিস তৈরি করুন, যার ভিতরে 5 সেকেন্ডের একটি বিলম্ব
থাকবে, তার পরে প্রমিসটি সম্পন্ন হবে, তার ফলাফল হিসেবে কোনো
টেক্সট ফেরত দিয়ে। সেই টেক্সটটি স্ক্রিনে প্রদর্শন করুন।