কিউ বা ব্লুবার্ডের মতো প্রতিশ্রুতিবদ্ধ গ্রন্থাগারগুলি এখন আমাদের ES6 প্রতিশ্রুতিতে ব্যবহার করার কারণ রয়েছে? [বন্ধ]


228

নোড.জেস প্রতিশ্রুতিগুলির জন্য দেশীয় সমর্থন যোগ করার পরে, কিউ বা ব্লুবার্ডের মতো লাইব্রেরিগুলি ব্যবহার করার কারণ রয়েছে?

উদাহরণস্বরূপ, যদি আপনি একটি নতুন প্রকল্প শুরু করছেন এবং আসুন এই প্রকল্পটি ধরে নেওয়া যাক আপনার এই লাইব্রেরিগুলি ব্যবহার করার কোনও নির্ভরতা নেই, তবে আমরা কি বলতে পারি যে এই জাতীয় লাইব্রেরি ব্যবহারের আরও কোনও কারণ নেই?


4
নেটিভ প্রতিশ্রুতি খুব খুব প্রাথমিক বৈশিষ্ট্য আছে। কিউ বা ব্লুবার্ডের মতো গ্রন্থাগারগুলি আরও একগুচ্ছ যোগ করে। আপনার যদি সেই বৈশিষ্ট্যগুলির প্রয়োজন হয় তবে সেই লাইব্রেরিগুলি ব্যবহার করুন।
gman

7
আমি শিরোনামটি "প্রয়োজনীয়তা" সম্পর্কে কম এবং "এখনও প্রতিশ্রুতি পাঠাগারগুলি ব্যবহারের কারণগুলি" সম্পর্কে আরও কম করার জন্য সম্পাদনা করেছি। এই প্রশ্নের উত্তর প্রাথমিকভাবে তথ্য সরবরাহ করে দেওয়া যেতে পারে, মতামত নয়। এটিকে পুনরায় খোলা উচিত কারণ এগুলির উত্তর সরবরাহ করা যেতে পারে এবং প্রাথমিকভাবে মতামত না দিয়ে। নীচের উত্তরটি এর একটি প্রদর্শন হিসাবে দেখুন।
jfriend00

11
@ জারোমন্ডাক্স - দয়া করে এখনই পুনরায় খোলার বিষয়টি বিবেচনা করুন যে প্রতিশ্রুতি পাঠাগার ব্যবহারের জন্য একজনের "প্রয়োজন" হবে না তার চেয়ে কেন কেউ প্রতিশ্রুতি গ্রন্থাগার ব্যবহার করবে সে সম্পর্কে শিরোনাম এবং প্রশ্নটি টুইট করা হয়েছে। আমার মতে, এই প্রশ্নের উত্তর দেওয়া যেতে পারে তথ্য সরবরাহ করে এবং প্রাথমিকভাবে মতামত না দিয়ে - নীচের উত্তরটি এর একটি প্রদর্শন হিসাবে দেখুন।
jender00

6
শিরোনাম সম্পাদনার পরে এই প্রশ্ন এবং এটির স্বীকৃত উত্তর, মতামত ভিত্তিক নয়।
সর্বাধিক

7
একমত। এটি তার বর্তমান ফর্মের মধ্যে একটি পুরোপুরি বৈধ প্রশ্ন। আমি পুনরায় খোলার জন্য মনোনীত করেছি।
জুলু

উত্তর:


367

পুরানো প্রবাদটি হ'ল কাজের জন্য আপনার সঠিক সরঞ্জামটি বেছে নেওয়া উচিত। ES6 প্রতিশ্রুতি বেসিক প্রদান। আপনি যদি চান বা যা চান তার সবই যদি বেসিক হয় তবে তা আপনার পক্ষে ঠিক কাজ করতে পারে। তবে, টুল বেসটিতে কেবলমাত্র বেসিকগুলির চেয়ে আরও বেশি সরঞ্জাম রয়েছে এবং এমন পরিস্থিতি রয়েছে যেখানে এই অতিরিক্ত সরঞ্জামগুলি খুব কার্যকর। এবং আমি যুক্তি দিয়েছি যে ES6 প্রতিশ্রুতি এমনকি প্রতিশ্রুতি মত কিছু বেসিক অনুপস্থিত যা প্রতিটি নোড.জেএস প্রকল্পে বেশ কার্যকর।

আমি ব্লুবার্ড প্রতিশ্রুতি গ্রন্থাগারের সাথে সর্বাধিক পরিচিত তাই আমি প্রায়শই সেই লাইব্রেরির সাথে আমার অভিজ্ঞতা থেকে কথা বলব।

সুতরাং, আরও সক্ষম প্রতিশ্রুতি গ্রন্থাগারটি ব্যবহার করার জন্য এখানে আমার শীর্ষ 6 টি কারণ রয়েছে

  1. অ-প্রচারিত অ্যাসিঙ্ক ইন্টারফেসগুলি - .promisify()এবং .promisifyAll()সেই সমস্ত অ্যাসিঙ্ক ইন্টারফেসগুলি হ্যান্ডেল করতে অবিশ্বাস্যভাবে কার্যকর যেগুলি এখনও সরল কলব্যাকগুলির প্রয়োজন এবং এখনও প্রতিশ্রুতি ফেরায় না - কোডের একটি লাইন পুরো ইন্টারফেসের একটি প্রতিশ্রুত সংস্করণ তৈরি করে।

  2. দ্রুত - বেশিরভাগ পরিবেশে ব্লুবার্ড দেশীয় প্রতিশ্রুতির তুলনায় উল্লেখযোগ্যভাবে দ্রুত

  3. অ্যাসিঙ্ক অ্যারে পুনরাবৃত্তির সিকোয়েন্সিং - Promise.mapSeries()বা Promise.reduce()আপনাকে প্রতিটি উপাদানগুলিতে একটি অ্যাসিঙ্ক অপারেশন কল করে অ্যারে দিয়ে পুনরাবৃত্তি করার অনুমতি দেয় তবে অ্যাসিঙ্ক ক্রিয়াকলাপগুলি সিকোয়েন্সিং করে যাতে তারা একের পর এক ঘটে থাকে, সমস্ত একই সময়ে হয় না। গন্তব্য সার্ভারের প্রয়োজন হয় বা আপনার একটি ফলাফল পরেরটিতে পাস করার কারণে আপনি এটি করতে পারেন।

  4. পলিফিল - আপনি যদি ব্রাউজার ক্লায়েন্টগুলির পুরানো সংস্করণে প্রতিশ্রুতি ব্যবহার করতে চান তবে যাইহোক আপনার পলিফিলের প্রয়োজন হবে। পাশাপাশি একটি সক্ষম পলিফিল পেতে পারি। যেহেতু নোড.জেসের ES6 প্রতিশ্রুতি রয়েছে, আপনাকে নোড.জেজে কোনও পলিফিলের দরকার নেই, তবে আপনি ব্রাউজারেও থাকতে পারেন। আপনি যদি নোড.জেএস সার্ভার এবং ক্লায়েন্ট উভয়কেই কোডিং করে থাকেন তবে উভয় ক্ষেত্রে একই প্রতিশ্রুতি গ্রন্থাগার এবং বৈশিষ্ট্যগুলি পাওয়া খুব কার্যকর হতে পারে (কোড ভাগ করা সহজ, পরিবেশের মধ্যে প্রসঙ্গের সুইচ, অ্যাসিঙ্ক কোডের জন্য সাধারণ কোডিং কৌশল ব্যবহার করা ইত্যাদি) .. ।)।

  5. অন্যান্য দরকারী বৈশিষ্ট্য - Bluebird হয়েছে Promise.map(), Promise.some(), Promise.any(), Promise.filter(), Promise.each()এবং Promise.props()সব যা মাঝে মাঝে সুবিধাজনক হয়। যদিও এই অপারেশনগুলি ES6 প্রতিশ্রুতি এবং অতিরিক্ত কোড দিয়ে সম্পাদন করা যায়, ব্লুবার্ড ইতিমধ্যে প্রাক-বিল্ট এবং প্রাক-পরীক্ষিত এই অপারেশনগুলির সাথে আসে যাতে এটি ব্যবহার করার জন্য এটি সহজ এবং কম কোড।

  6. সতর্কতা এবং সম্পূর্ণ স্ট্যাকের চিহ্নগুলিতে অন্তর্নির্মিত - ব্লুবার্ডের এমন অনেকগুলি সতর্কবাণী রয়েছে যা আপনাকে সম্ভবত ভুল কোড বা কোনও বাগের সমস্যাগুলির বিষয়ে সতর্ক করে। উদাহরণস্বরূপ, যদি আপনি কোনও ফাংশন কল করেন যা .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
});

যদিও এটি বেদনাদায়কভাবে কিছু উপায়ে মানসম্মত নয় - তারা দাবি করে যে তারা এখন "প্রতিশ্রুতি / এ + সামঞ্জস্যপূর্ণ" :) :) - blog.jquery.com/2016/01/14/jquery-3-0-
বেটা-

1
@ থেফোর্তে - হ্যাঁ, আমি জানি তারা 3.0 সালে প্রতিশ্রুতি / এ + সামঞ্জস্যের দিকে কাজ করে চলেছে। তবে, এটি এখনও বিটাতে রয়েছে। যদি এটি প্রতিশ্রুতি অবধি থাকে (শঙ্কিত উদ্দেশ্যে), আপনি যদি ইতিমধ্যে jQuery ব্যবহার করে থাকেন তবে এটি ব্রাউজার জেএস-এ কোনও বাহ্যিক প্রতিশ্রুতি গ্রন্থাগার ব্যবহারের কিছু কারণকে অকার্যকর করতে পারে। এটিতে এখনও ব্লুবার্ডের মতো সমস্ত দরকারী বৈশিষ্ট্য থাকবে না এবং এটি যদি ব্লুবার্ডের অভিনয় ধরে বেঁচে থাকে তবে আমি অত্যন্ত অবাক হব তাই কোনও কোনও ক্ষেত্রে ভবিষ্যতের jQuery পাশাপাশি ব্লুবার্ডের অবকাশ রয়েছে। যাইহোক, ওপির প্রশ্নটি বেশিরভাগ নোড.জেএস সম্পর্কে বলে মনে হয়।
jender00

1
গত উদাহরণ কোডে একটু টাইপো হল: return new Promise(function(resolve, rejct)। হওয়া উচিত:reject
সেবাস্তিয়ান মুসিজিস্কি

7
util.promisifyসরাসরি কোনও promisifyAllসমতুল্য না থাকলেও নোড.জেএসের আসলে এখন রয়েছে ।
nyuszika7h

1
@ আরাস্ট - হ্যাঁ, ভি 11 যত্নশীল fs, তবে এখনও ব্লুবার্ড ব্যবহার করার আরও কয়েকটি কারণ (আমার নির্দিষ্ট concurrencyপছন্দটি বিকল্পটি Promise.map()) আপনি লক্ষ্যমাত্রার পরিষেবাকে অপ্রতিরোধ্য থেকে বিরত রাখতে পারেন যাতে আপনাকে সমান্তরাল অনুরোধগুলির একটি গুচ্ছ তৈরি করতে হবে। এছাড়াও, এখনও ব্লুবার্ডের প্রোমিসিফএল সহ অন্যান্য প্রচুর অ-প্রচারিত ইন্টারফেস। তবে, ধীরে ধীরে প্রতিটি নতুন প্রকল্পে ব্লুবার্ডের জন্য অবিলম্বে দখল করার কারণগুলি নোড.জেস নিজেই এর বিল্ট-ইন প্রতিশ্রুতি সমর্থনকে আরও বাড়িয়ে তুলবে বলে বিলম্ব হচ্ছে।
jender00
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.