পুরানো প্রবাদটি হ'ল কাজের জন্য আপনার সঠিক সরঞ্জামটি বেছে নেওয়া উচিত। ES6 প্রতিশ্রুতি বেসিক প্রদান। আপনি যদি চান বা যা চান তার সবই যদি বেসিক হয় তবে তা আপনার পক্ষে ঠিক কাজ করতে পারে। তবে, টুল বেসটিতে কেবলমাত্র বেসিকগুলির চেয়ে আরও বেশি সরঞ্জাম রয়েছে এবং এমন পরিস্থিতি রয়েছে যেখানে এই অতিরিক্ত সরঞ্জামগুলি খুব কার্যকর। এবং আমি যুক্তি দিয়েছি যে ES6 প্রতিশ্রুতি এমনকি প্রতিশ্রুতি মত কিছু বেসিক অনুপস্থিত যা প্রতিটি নোড.জেএস প্রকল্পে বেশ কার্যকর।
আমি ব্লুবার্ড প্রতিশ্রুতি গ্রন্থাগারের সাথে সর্বাধিক পরিচিত তাই আমি প্রায়শই সেই লাইব্রেরির সাথে আমার অভিজ্ঞতা থেকে কথা বলব।
সুতরাং, আরও সক্ষম প্রতিশ্রুতি গ্রন্থাগারটি ব্যবহার করার জন্য এখানে আমার শীর্ষ 6 টি কারণ রয়েছে
অ-প্রচারিত অ্যাসিঙ্ক ইন্টারফেসগুলি - .promisify()
এবং .promisifyAll()
সেই সমস্ত অ্যাসিঙ্ক ইন্টারফেসগুলি হ্যান্ডেল করতে অবিশ্বাস্যভাবে কার্যকর যেগুলি এখনও সরল কলব্যাকগুলির প্রয়োজন এবং এখনও প্রতিশ্রুতি ফেরায় না - কোডের একটি লাইন পুরো ইন্টারফেসের একটি প্রতিশ্রুত সংস্করণ তৈরি করে।
দ্রুত - বেশিরভাগ পরিবেশে ব্লুবার্ড দেশীয় প্রতিশ্রুতির তুলনায় উল্লেখযোগ্যভাবে দ্রুত ।
অ্যাসিঙ্ক অ্যারে পুনরাবৃত্তির সিকোয়েন্সিং - Promise.mapSeries()
বা Promise.reduce()
আপনাকে প্রতিটি উপাদানগুলিতে একটি অ্যাসিঙ্ক অপারেশন কল করে অ্যারে দিয়ে পুনরাবৃত্তি করার অনুমতি দেয় তবে অ্যাসিঙ্ক ক্রিয়াকলাপগুলি সিকোয়েন্সিং করে যাতে তারা একের পর এক ঘটে থাকে, সমস্ত একই সময়ে হয় না। গন্তব্য সার্ভারের প্রয়োজন হয় বা আপনার একটি ফলাফল পরেরটিতে পাস করার কারণে আপনি এটি করতে পারেন।
পলিফিল - আপনি যদি ব্রাউজার ক্লায়েন্টগুলির পুরানো সংস্করণে প্রতিশ্রুতি ব্যবহার করতে চান তবে যাইহোক আপনার পলিফিলের প্রয়োজন হবে। পাশাপাশি একটি সক্ষম পলিফিল পেতে পারি। যেহেতু নোড.জেসের ES6 প্রতিশ্রুতি রয়েছে, আপনাকে নোড.জেজে কোনও পলিফিলের দরকার নেই, তবে আপনি ব্রাউজারেও থাকতে পারেন। আপনি যদি নোড.জেএস সার্ভার এবং ক্লায়েন্ট উভয়কেই কোডিং করে থাকেন তবে উভয় ক্ষেত্রে একই প্রতিশ্রুতি গ্রন্থাগার এবং বৈশিষ্ট্যগুলি পাওয়া খুব কার্যকর হতে পারে (কোড ভাগ করা সহজ, পরিবেশের মধ্যে প্রসঙ্গের সুইচ, অ্যাসিঙ্ক কোডের জন্য সাধারণ কোডিং কৌশল ব্যবহার করা ইত্যাদি) .. ।)।
অন্যান্য দরকারী বৈশিষ্ট্য - Bluebird হয়েছে Promise.map()
, Promise.some()
, Promise.any()
, Promise.filter()
, Promise.each()
এবং Promise.props()
সব যা মাঝে মাঝে সুবিধাজনক হয়। যদিও এই অপারেশনগুলি ES6 প্রতিশ্রুতি এবং অতিরিক্ত কোড দিয়ে সম্পাদন করা যায়, ব্লুবার্ড ইতিমধ্যে প্রাক-বিল্ট এবং প্রাক-পরীক্ষিত এই অপারেশনগুলির সাথে আসে যাতে এটি ব্যবহার করার জন্য এটি সহজ এবং কম কোড।
সতর্কতা এবং সম্পূর্ণ স্ট্যাকের চিহ্নগুলিতে অন্তর্নির্মিত - ব্লুবার্ডের এমন অনেকগুলি সতর্কবাণী রয়েছে যা আপনাকে সম্ভবত ভুল কোড বা কোনও বাগের সমস্যাগুলির বিষয়ে সতর্ক করে। উদাহরণস্বরূপ, যদি আপনি কোনও ফাংশন কল করেন যা .then()
সেই প্রতিশ্রুতিটি না ফেরিয়ে একটি হ্যান্ডলারের অভ্যন্তরে একটি নতুন প্রতিশ্রুতি তৈরি করে (এটি বর্তমান প্রতিশ্রুতি শৃঙ্খলে লিঙ্ক করতে), তবে বেশিরভাগ ক্ষেত্রেই এটি একটি দুর্ঘটনাকুল বাগ এবং ব্লুবার্ড আপনাকে একটি সতর্কতা দেয় প্রভাব। অন্যান্য বিল্ট-ইন ব্লুবার্ড সতর্কতাগুলি এখানে বর্ণিত হয়েছে ।
এই বিভিন্ন বিষয়ে আরও কিছু বিশদ এখানে:
PromisifyAll
যে কোনও নোড.জেএস প্রকল্পে আমি তত্ক্ষণাত ব্লুবার্ড ব্যবহার করি কারণ আমি মডিউলটির .promisifyAll()
মতো স্ট্যান্ডার্ড নোড.জেএস মডিউলগুলিতে প্রচুর ব্যবহার করি fs
।
নোড.জেএস নিজেই বিল্ট-ইন মডিউলগুলিতে কোনও প্রতিশ্রুতি ইন্টারফেস সরবরাহ করে না যা fs
মডিউলটির মতো অ্যাসিঙ্ক আইও করে । সুতরাং, আপনি যদি সেই ইন্টারফেসগুলির সাথে প্রতিশ্রুতিগুলি ব্যবহার করতে চান তবে আপনি প্রতিটি মডিউল ফাংশনটি ব্যবহার করার জন্য একটি প্রতিশ্রুতি মোড়ক ব্যবহার করতে বা আপনার কাছে এটি করতে পারে বা প্রতিশ্রুতিগুলি না ব্যবহার করতে পারে এমন একটি লাইব্রেরি পাবেন code
Bluebird এর Promise.promisify()
এবং Promise.promisifyAll()
কনভেনশন ASYNC API গুলি কলিং প্রতিশ্রুতি ফিরতে Node.js এর একটি স্বয়ংক্রিয় মোড়ানো প্রদান। এটি অত্যন্ত দরকারী এবং সময় সাশ্রয়ী। আমি সব সময় এটি ব্যবহার।
এটি কীভাবে কাজ করে তার একটি উদাহরণ এখানে:
const Promise = require('bluebird');
const fs = Promise.promisifyAll(require('fs'));
fs.readFileAsync('somefile.text').then(function(data) {
// do something with data here
});
বিকল্পটি হ'ল ম্যানুয়ালি fs
আপনি যে প্রতিটি API ব্যবহার করতে চেয়েছিলেন তার নিজের প্রতিশ্রুতি মোড়ক তৈরি করতে হবে:
const fs = require('fs');
function readFileAsync(file, options) {
return new Promise(function(resolve, reject) {
fs.readFile(file, options, function(err, data) {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}
readFileAsync('somefile.text').then(function(data) {
// do something with data here
});
এবং, আপনি যে API ব্যবহার করতে চান তার জন্য আপনাকে ম্যানুয়ালি এটি করতে হবে। এটি স্পষ্টভাবে কোনও অর্থবোধ করে না। এটি বয়লারপ্লেট কোড। আপনি পাশাপাশি একটি ইউটিলিটি পেতে পারেন যা এটি আপনার জন্য কাজ করে। ব্লুবার্ড Promise.promisify()
এবং Promise.promisifyAll()
এরকম একটি ইউটিলিটি।
অন্যান্য দরকারী বৈশিষ্ট্য
এখানে ব্লুবার্ডের কয়েকটি বৈশিষ্ট্য রয়েছে যা আমি বিশেষভাবে দরকারী বলে মনে করি (নীচে কয়েকটি কোড উদাহরণ রয়েছে যা কীভাবে এটি কোড বা গতির বিকাশ সংরক্ষণ করতে পারে):
Promise.promisify()
Promise.promisifyAll()
Promise.map()
Promise.reduce()
Promise.mapSeries()
Promise.delay()
এটির দরকারী কার্যকারিতা ছাড়াও, Promise.map()
একটি সন্ধি বিকল্পটি সমর্থন করে যা আপনাকে একই সাথে কতগুলি ক্রিয়াকলাপ চালানোর অনুমতি দেওয়া উচিত তা নির্দিষ্ট করতে দেয় যা আপনার যখন প্রচুর কিছু করার থাকে তখন বিশেষত কার্যকর হয় তবে বাইরে থেকে কিছু চালিয়ে যেতে পারে না সম্পদ।
এর মধ্যে কয়েকটি উভয়কে একা বলা যেতে পারে এবং এমন একটি প্রতিশ্রুতি হিসাবে ব্যবহার করা যেতে পারে যা নিজেই একটি পুনরাবৃত্তির সমাধান করে যা প্রচুর কোড সংরক্ষণ করতে পারে।
Polyfill
একটি ব্রাউজার প্রকল্পে, যেহেতু আপনি এখনও কিছু ব্রাউজারগুলিকে সমর্থন করতে চান যা প্রতিশ্রুতি সমর্থন করে না, তাই আপনাকে যাইহোক একটি পলিফিলের প্রয়োজন হবে। আপনি যদি jQuery ব্যবহার করেন তবে আপনি কখনও কখনও কেবল jQuery হিসাবে নির্মিত প্রতিশ্রুতি সমর্থনটি ব্যবহার করতে পারেন (যদিও এটি কিছু উপায়ে বেদনাদায়কভাবে মানসম্মত নয়, সম্ভবত jQuery 3.0 এ স্থির করা হয়েছে), তবে যদি প্রকল্পটিতে কোনও স্বাক্ষরযুক্ত অ্যাসিঙ্ক ক্রিয়াকলাপ জড়িত থাকে তবে আমি খুঁজে পাই ব্লুবার্ডে বর্ধিত বৈশিষ্ট্যগুলি খুব কার্যকর।
দ্রুত
এছাড়াও লক্ষণীয় যে ব্লুবার্ডের প্রতিশ্রুতিগুলি ভি 8 এর মধ্যে প্রতিশ্রুতিগুলির তুলনায় উল্লেখযোগ্যভাবে দ্রুত গতিতে দেখা দিয়েছে। সেই বিষয়ে আরও আলোচনার জন্য এই পোস্টটি দেখুন ।
একটি বড় জিনিস নোড.জেএস অনুপস্থিত
নোড.জেএস ডেভেলপমেন্টে ব্লুবার্ডকে কম ব্যবহার করার বিষয়টি আমাকে কী বিবেচনা করবে তা যদি নোড.জেগুলি একটি প্রতিশ্রুতিবদ্ধ ফাংশনে নির্মিত হয় তবে আপনি এরকম কিছু করতে পারেন:
const fs = requirep('fs');
fs.readFileAsync('somefile.text').then(function(data) {
// do something with data here
});
বা বিল্ট-ইন মডিউলগুলির অংশ হিসাবে কেবল ইতিমধ্যে প্রস্তাবিত পদ্ধতিগুলি সরবরাহ করুন।
ততক্ষণ, আমি এটি ব্লুবার্ডের সাহায্যে করছি:
const Promise = require('bluebird');
const fs = Promise.promisifyAll(require('fs'));
fs.readFileAsync('somefile.text').then(function(data) {
// do something with data here
});
ES6 প্রতিশ্রুতি সমর্থনটি নোড.জেজে অন্তর্নির্মিত হওয়া এবং বিল্ট-ইন মডিউলগুলির কোনওটি ফেরতের প্রতিশ্রুতি না পাওয়া কিছুটা বিশ্রী বলে মনে হচ্ছে। এটি node.js. এ বাছাই করা দরকার। ততক্ষণে আমি ব্লুবার্ড ব্যবহার করে পুরো লাইব্রেরি প্রচার করি। সুতরাং, মনে হচ্ছে প্রতিশ্রুতিগুলি নোড.জেজে এখন প্রায় 20% বাস্তবায়িত হয়েছে কারণ কোনও বিল্ট-ইন মডিউলগুলির মধ্যে কোনওটি আপনাকে ম্যানুয়ালি প্রথমে মোড়ানো না দিয়ে তাদের সাথে প্রতিশ্রুতি ব্যবহার করতে দেয়।
উদাহরণ
সমতল প্রতিশ্রুতি বনাম ব্লুবার্ডের প্রতিশ্রুতি দেওয়ার Promise.map()
জন্য এবং সমান্তরালভাবে ফাইলগুলির সেট পড়ার জন্য এবং সমস্ত ডেটা সহ সম্পন্ন করার সময় বিজ্ঞপ্তির জন্য এখানে একটি উদাহরণ রয়েছে :
সরল প্রতিশ্রুতি
const files = ["file1.txt", "fileA.txt", "fileB.txt"];
const fs = require('fs');
// make promise version of fs.readFile()
function fsReadFileP(file, options) {
return new Promise(function(resolve, reject) {
fs.readFile(file, options, function(err, data) {
if (err) return reject(err);
resolve(data);
});
});
}
Promise.all(files.map(fsReadFileP)).then(function(results) {
// files data in results Array
}, function(err) {
// error here
});
ব্লুবার্ড Promise.map()
এবংPromise.promisifyAll()
const Promise = require('bluebird');
const fs = Promise.promisifyAll(require('fs'));
const files = ["file1.txt", "fileA.txt", "fileB.txt"];
Promise.map(files, fs.readFileAsync).then(function(results) {
// files data in results Array
}, function(err) {
// error here
});
ব্লুবার্ডের প্রতিশ্রুতিবদ্ধ বনভূমি এবং Promise.map()
রিমোট হোস্টের একগুচ্ছ ইউআরএলগুলি পড়ার সময় আপনি এখানে এক সাথে সর্বাধিক 4 টি পড়তে পারেন, তবে যতগুলি অনুরোধ সমান্তরালে রাখতে চান তেমন অনুরোধ রাখতে চাই:
সরল জেএস প্রতিশ্রুতি
const request = require('request');
const urls = [url1, url2, url3, url4, url5, ....];
// make promisified version of request.get()
function requestGetP(url) {
return new Promise(function(resolve, reject) {
request.get(url, function(err, data) {
if (err) return reject(err);
resolve(data);
});
});
}
function getURLs(urlArray, concurrentLimit) {
var numInFlight = 0;
var index = 0;
var results = new Array(urlArray.length);
return new Promise(function(resolve, reject) {
function next() {
// load more until concurrentLimit is reached or until we got to the last one
while (numInFlight < concurrentLimit && index < urlArray.length) {
(function(i) {
requestGetP(urlArray[index++]).then(function(data) {
--numInFlight;
results[i] = data;
next();
}, function(err) {
reject(err);
});
++numInFlight;
})(index);
}
// since we always call next() upon completion of a request, we can test here
// to see if there was nothing left to do or finish
if (numInFlight === 0 && index === urlArray.length) {
resolve(results);
}
}
next();
});
}
ব্লুবার্ড প্রতিশ্রুতি
const Promise = require('bluebird');
const request = Promise.promisifyAll(require('request'));
const urls = [url1, url2, url3, url4, url5, ....];
Promise.map(urls, request.getAsync, {concurrency: 4}).then(function(results) {
// urls fetched in order in results Array
}, function(err) {
// error here
});