JavaScript কোর্স থেকে আপনি ইতিমধ্যে জানেন একটি promise কী — এমন একটি অবজেক্ট যা এখনো প্রস্তুত নয় এমন একটি মানকে প্রতিনিধিত্ব করে। এই পাঠটি নিয়ে যে Node-এ ঠিক কোথায় promise দেখা যায়, আর একটি API যদি শুধু callback দেয় তাহলে কীভাবে একটি promise পাওয়া যায়।
আগের পাঠের nested fs.readFile() কলগুলো fs-এর callback API ব্যবহার করে। fs/promises-এ স্যুইচ করলে nest করার বদলে .then() চেইন দিয়ে এটি সমতল হয়ে যায়:
const fs = require('fs/promises')
fs.readFile('user.json', 'utf8')
.then((userData) => fs.readFile('settings.json', 'utf8'))
.then((settingsData) => fs.readFile('preferences.json', 'utf8'))
.then((prefData) => console.log('All data loaded'))
.catch((err) => console.error('Something failed:', err))শেষে একটি .catch() এখন প্রতিটি callback-এ একই error চেক পুনরাবৃত্তি করার বদলে যেকোনো ধাপ থেকে একটি ব্যর্থতা সামলায়।
সেই তিনটি read আসলে একে অপরের উপর নির্ভর করে না — প্রতিটি কোনো বাস্তব কারণ ছাড়াই আগেরটি শেষ হওয়ার জন্য অপেক্ষা করে। Promise.all() সবগুলো একসাথে শুরু করে আর প্রতিটি শেষ হওয়ার জন্য অপেক্ষা করে:
Promise.all([
fs.readFile('user.json', 'utf8'),
fs.readFile('settings.json', 'utf8'),
fs.readFile('preferences.json', 'utf8'),
])
.then(([userData, settingsData, prefData]) => {
console.log('All data loaded')
})
.catch((err) => console.error('Something failed:', err))এটি তিনটির যোগফলের বদলে মোটামুটি সবচেয়ে ধীর একক read-এর মতো দ্রুত শেষ হয় — একটি সার্ভার অনেক রিকোয়েস্ট সামলানোর সময় এটি একটি বাস্তব পার্থক্য।
প্রতিটি ফাংশন promise ভার্সন দেয় না। Node-এর বিল্ট-ইন util.promisify() যেকোনো error-first callback ফাংশনকে এমন একটিতে রূপান্তর করে যা একটি promise ফেরত দেয়:
const util = require('util')
const fs = require('fs')
const readFileAsync = util.promisify(fs.readFile)
readFileAsync('data.txt', 'utf8')
.then((data) => console.log(data))
.catch((err) => console.error(err))util.promisify() শুধু সেই ফাংশনগুলোতে কাজ করে যা আগের পাঠের Node-এর error-first callback প্রথা মেনে চলে — callback-এর প্রথম প্যারামিটার অবশ্যই error হতে হবে। Node-এর নিজের বেশিরভাগ API এই যোগ্যতা পূরণ করে।
| পরিস্থিতি | সাধারণত যা promise-টি reject করে |
|---|---|
| একটি ফাইল পড়া | ফাইলটি নেই, অথবা প্রোগ্রামের এটি পড়ার অনুমতি নেই |
| একটি নেটওয়ার্ক রিকোয়েস্ট করা | অন্য সার্ভারটি অপ্রাপ্য, অথবা টাইমআউট হয় |
| JSON পার্স করা | টেক্সটটি বৈধ JSON নয় |