क्या अभी भी Q या BlueBird जैसे वादा पुस्तकालयों का उपयोग करने के कारण हैं कि हमारे पास ES6 वादे हैं? [बन्द है]


228

Node.js ने वादों के लिए मूल समर्थन को जोड़ने के बाद, क्यू या ब्लूबर्ड जैसी पुस्तकालयों का उपयोग करने के लिए अभी भी कारण हैं?

उदाहरण के लिए यदि आप एक नई परियोजना शुरू कर रहे हैं और इस परियोजना में मान लें कि आपके पास इन पुस्तकालयों का उपयोग करने वाली कोई निर्भरता नहीं है, तो क्या हम यह कह सकते हैं कि ऐसे पुस्तकालयों का उपयोग करने के लिए वास्तव में और कोई कारण नहीं हैं?


4
देशी वादों में बहुत बुनियादी सुविधाएँ होती हैं। क्यू या ब्लूबर्ड जैसे पुस्तकालय एक गुच्छा अधिक जोड़ते हैं। यदि आपको उन सुविधाओं की आवश्यकता है तो उन पुस्तकालयों का उपयोग करें।
gman

7
मैंने शीर्षक को "ज़रूरत" के बारे में कम और "अभी भी वादा पुस्तकालयों का उपयोग करने के कारणों" के बारे में अधिक करने के लिए संपादित किया। इस सवाल का उत्तर मुख्य रूप से तथ्यों की आपूर्ति से दिया जा सकता है, राय नहीं। इसे फिर से खोलना चाहिए क्योंकि इसका जवाब तथ्यों की आपूर्ति करके दिया जा सकता है और मुख्य रूप से राय नहीं। नीचे दिए गए उत्तर को उसी के प्रदर्शन के रूप में देखें।
jfriend00

11
@JaromandaX - कृपया अब फिर से विचार करें कि शीर्षक और प्रश्न के बारे में अधिक जानकारी दी गई है कि एक वादे के पुस्तकालय का उपयोग करने के बजाय क्या एक वादा पुस्तकालय का उपयोग करेगा। मेरी राय में, इस सवाल का जवाब तथ्यों की आपूर्ति करके दिया जा सकता है, न कि मुख्य रूप से राय - नीचे दिए गए जवाब को उसी के प्रदर्शन के रूप में देखें।
jfriend00

6
शीर्षक संपादित करने के बाद यह प्रश्न, और इसके स्वीकृत उत्तर, राय-आधारित नहीं हैं।
अधिकतम

7
माना। यह अपने वर्तमान स्वरूप में एक सर्वथा मान्य प्रश्न है। मैंने फिर से खोलने के लिए नामांकित किया है।
जूल्स

जवाबों:


367

पुरानी कहावत है कि आपको नौकरी के लिए सही उपकरण चुनना चाहिए। ES6 वादे मूल बातें प्रदान करते हैं। यदि आप कभी भी चाहते हैं या जरूरत मूल बातें है, तो आपके लिए बस ठीक काम करना चाहिए। लेकिन, केवल मूल बातों की तुलना में टूल बिन में अधिक उपकरण हैं और ऐसी परिस्थितियां हैं जहां उन अतिरिक्त उपकरण बहुत उपयोगी हैं। और, मुझे लगता है कि ES6 वादे भी कुछ मूल बातें की तरह याद आ रही है कि बहुत ज्यादा हर नोड में उपयोगी हैं। Js परियोजना।

मैं ब्लूबर्ड वादा पुस्तकालय से सबसे अधिक परिचित हूं हूं इसलिए मैं उस पुस्तकालय के साथ अपने अनुभव से बात करूंगा।

तो, यहाँ एक अधिक सक्षम वादा पुस्तकालय का उपयोग करने के लिए मेरे शीर्ष 6 कारण हैं

  1. गैर-वचनबद्ध async इंटरफेस - .promisify()और .promisifyAll()उन सभी async इंटरफेस को संभालने के लिए अविश्वसनीय रूप से उपयोगी होते हैं जिन्हें अभी भी सादे कॉलबैक की आवश्यकता होती है और अभी तक वादे वापस नहीं करते हैं - कोड की एक पंक्ति एक संपूर्ण इंटरफ़ेस का एक प्रांप्टेड संस्करण बनाती है।

  2. तेज़ - अधिकांश वातावरणों में मूल वादों की तुलना में ब्लूबर्ड काफी तेज़ है।

  3. Async सरणी पुनरावृत्ति का अनुक्रमण - Promise.mapSeries()या Promise.reduce()आपको एक सरणी के माध्यम से पुनरावृति करने की अनुमति देता है, प्रत्येक तत्व पर एक async ऑपरेशन को बुलाता है, लेकिन async संचालनों को अनुक्रमण करता है ताकि वे एक के बाद एक हो, एक ही समय में सभी नहीं। आप ऐसा कर सकते हैं क्योंकि गंतव्य सर्वर को इसकी आवश्यकता है या क्योंकि आपको अगले परिणाम के लिए एक पास करने की आवश्यकता है।

  4. पॉलीफ़िल - यदि आप ब्राउज़र क्लाइंट के पुराने संस्करणों में वादों का उपयोग करना चाहते हैं, तो आपको वैसे भी पॉलीफ़िल की आवश्यकता होगी। साथ ही एक सक्षम पॉलीफ़िल प्राप्त कर सकते हैं। चूंकि नोड.जेएस के पास ईएस 6 वादे हैं, इसलिए आपको नोड.जेएस में पॉलीफिल की आवश्यकता नहीं है, लेकिन आप एक ब्राउज़र में हो सकते हैं। यदि आप दोनों नोड.जेएस सर्वर और क्लाइंट को कोड कर रहे हैं, तो दोनों में एक ही वादा पुस्तकालय और सुविधाओं के लिए बहुत उपयोगी हो सकता है (कोड साझा करना आसान, पर्यावरण के बीच संदर्भ स्विच, async कोड के लिए सामान्य कोडिंग तकनीकों का उपयोग करना, आदि।) ।)।

  5. अन्य उपयोगी सुविधाएं - Bluebird है Promise.map(), Promise.some(), Promise.any(), Promise.filter(), Promise.each()और Promise.props()सभी जिनमें से कभी कभी काम कर रहे हैं। जबकि इन ऑपरेशनों को ईएस 6 वादों और अतिरिक्त कोड के साथ किया जा सकता है, ब्लूबर्ड इन ऑपरेशनों के साथ आता है जो पहले से निर्मित और पूर्व-परीक्षण किए गए हैं इसलिए यह उनका उपयोग करने के लिए सरल और कम कोड है।

  6. चेतावनियों और पूर्ण स्टैक के निशानों में निर्मित - ब्लूबर्ड में कई चेतावनियाँ हैं जो आपको उन मुद्दों के प्रति सचेत करती हैं जो शायद गलत कोड या बग हैं। उदाहरण के लिए, यदि आप किसी फ़ंक्शन को उस वादे .then()को वापस किए बिना एक नया वादा बनाते हैं, तो उस वादे (वर्तमान वादे की श्रृंखला में इसे जोड़ने के लिए), तो ज्यादातर मामलों में, यह एक आकस्मिक बग है और ब्लूबर्ड आपको एक चेतावनी देगा। प्रभाव। अन्य बिल्ट-इन ब्लूबर्ड चेतावनियाँ यहाँ वर्णित हैं

यहाँ इन विभिन्न विषयों पर कुछ और विवरण दिए गए हैं:

PromisifyAll

किसी भी नोड.जेएस परियोजना में, मैं तुरंत हर जगह ब्लूबर्ड का उपयोग .promisifyAll()करता हूं क्योंकि मैं मानक नोड पर बहुत अधिक उपयोग करता हूं। जैसे मॉड्यूलfs । ।

Node.js स्वयं अंतर्निहित मॉड्यूल को एक वादा इंटरफ़ेस प्रदान नहीं करता है जो कि इस तरह से async IO करते हैं fs मॉड्यूल की । इसलिए, यदि आप उन इंटरफेस के साथ वादों का उपयोग करना चाहते हैं जो आपके द्वारा उपयोग किए जाने वाले प्रत्येक मॉड्यूल फ़ंक्शन के आसपास या तो हाथ कोड को एक वादा आवरण के लिए छोड़ दिया जाता है या एक पुस्तकालय प्राप्त करें जो आपके लिए ऐसा कर सकता है या वादों का उपयोग नहीं कर सकता है।

ब्लूबर्ड का Promise.promisify()और Promise.promisifyAll()वादों को वापस करने के लिए अधिवेशन के लिए कॉलिंग async APIs नोड का एक स्वचालित रैपिंग प्रदान करता है। यह बेहद उपयोगी और समय की बचत है। मैं इसका हर समय उपयोग करता हूं।

यहां बताया गया है कि कैसे काम करता है:

const Promise = require('bluebird');
const fs = Promise.promisifyAll(require('fs'));

fs.readFileAsync('somefile.text').then(function(data) {
   // do something with data here
});

इसका विकल्प यह होगा कि आप जिस भी fsएपीआई का उपयोग करना चाहते हैं, उसके लिए अपना खुद का वादा रैपर बनाएं।

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
});

और, आपको मैन्युअल रूप से प्रत्येक एपीआई फ़ंक्शन का उपयोग करना होगा। यह स्पष्ट रूप से समझ में नहीं आता है। यह बॉयलरप्लेट कोड है। आपको एक उपयोगिता मिल सकती है जो आपके लिए यह काम करती है। ब्लूबर्ड Promise.promisify()औरPromise.promisifyAll() इस तरह की एक उपयोगिता है।

अन्य उपयोगी सुविधाएँ

यहां कुछ ब्लूबर्ड फीचर्स दिए गए हैं जो मुझे विशेष रूप से उपयोगी लगते हैं (नीचे कुछ कोड उदाहरण दिए गए हैं कि ये कोड कैसे बचा सकते हैं)

Promise.promisify()
Promise.promisifyAll()
Promise.map()
Promise.reduce()
Promise.mapSeries()
Promise.delay()

इसके उपयोगी फ़ंक्शन के अलावा, Promise.map()एक संगामिति विकल्प का भी समर्थन करता है जो आपको यह निर्दिष्ट करने की अनुमति देता है कि एक ही समय में कितने ऑपरेशन चलाने की अनुमति दी जानी चाहिए जो विशेष रूप से उपयोगी है जब आपके पास बहुत कुछ करने के लिए होता है, लेकिन कुछ को बाहर नहीं निकाल सकता है संसाधन।

इनमें से कुछ को स्टैंड-अलोन कहा जा सकता है और एक ऐसे वादे पर प्रयोग किया जाता है जो खुद एक पुनरावृत्त के लिए हल होता है जो बहुत सारे कोड को बचा सकता है।


polyfill

एक ब्राउज़र परियोजना में, क्योंकि आप आम तौर पर अभी भी कुछ ब्राउज़रों का समर्थन करना चाहते हैं, जिनके पास वादा समर्थन नहीं है, आपको वैसे भी पॉलीफ़िल की आवश्यकता है। यदि आप jQuery का उपयोग भी कर रहे हैं, तो आप कभी-कभी सिर्फ jQuery में निर्मित वादा समर्थन का उपयोग कर सकते हैं (हालांकि यह कुछ मायनों में गैर-मानक है, शायद jQuery 3.0 में तय किया गया है), लेकिन अगर परियोजना में कोई भी हस्ताक्षरकर्ता async गतिविधि शामिल है, तो मुझे पता चलता है ब्लूबर्ड में विस्तारित सुविधाएँ बहुत उपयोगी हैं।


और तेज

यह भी ध्यान देने योग्य है कि ब्लूबर्ड के वादे V8 में किए गए वादों की तुलना में काफी तेज दिखाई देते हैं। उस विषय पर अधिक चर्चा के लिए यह पोस्ट देखें ।


ए बिग थिंग नोड.जेएस मिसिंग है

क्या मैं ब्लूबर्ड को नोड में कम उपयोग करने पर विचार करूंगा। जेएस विकास होगा यदि नोड। जेएस एक प्रोमोशनल फ़ंक्शन में बनाया गया है तो आप इस तरह से कुछ कर सकते हैं:

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 वादा समर्थन को नोड.जेएस में बनाया जाना थोड़ा अजीब लगता है और इसमें बिल्ट-इन मॉड्यूल रिटर्न वादों में से कोई भी नहीं है। यह नोड में हल किया जाना चाहिए। तब तक, मैं पूरे पुस्तकालयों को बढ़ावा देने के लिए ब्लूबर्ड का उपयोग करता हूं। इसलिए, ऐसा लगता है कि वादे नोड में लगभग 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()दूरस्थ होस्ट से URL का एक गुच्छा पढ़ते समय जहाँ आप एक समय में अधिकतम 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
});

हालांकि यह कुछ मायनों में गैर-मानक है - वे दावा करते हैं कि अब वे "वचन / A + संगत" हैं: - blog.jquery.com/2016/01/14/jquery-3-0-beta-released
thefourtheb

1
@thefourtheye - हां, मुझे पता है कि वे 3.0 में वादा / ए + संगतता की दिशा में काम कर रहे हैं। लेकिन, यह अभी भी बीटा में है। यदि यह वादे (उद्देश्य के अनुसार) तक रहता है, तो यह ब्राउज़र जेएस में बाहरी वादा पुस्तकालय का उपयोग करने के कुछ कारणों को कम कर सकता है यदि आप पहले से ही jQuery का उपयोग कर रहे थे। यह अभी भी सभी उपयोगी विशेषताएं नहीं है जो Bluebird करता है और मुझे बहुत आश्चर्य होगा अगर यह Bluebird के प्रदर्शन तक रहता है, तो कुछ मामलों में भविष्य jQuery के साथ Bluebird के लिए अभी भी जगह है। किसी भी स्थिति में, ओपी का प्रश्न अधिकतर नोड के बारे में प्रतीत होता है।
jfriend00

1
अंतिम उदाहरण कोड में थोड़ा टाइपो है return new Promise(function(resolve, rejct):। होना चाहिए:reject
सेबस्टियन मुस्ज़स्की

7
Node.js वास्तव में util.promisifyअब है, हालांकि कोई प्रत्यक्ष promisifyAllसमकक्ष नहीं है।
nyuszika7h

1
@Aurast - हाँ, v11 का ध्यान रखता है fs, लेकिन अभी भी ब्लूबर्ड (मेरा विशेष पसंदीदा concurrencyविकल्प है Promise.map()) का उपयोग करने के लिए कुछ अन्य कारणों से एक लक्ष्य सेवा को भारी रखने के लिए जिसे आपको समानांतर अनुरोधों का एक गुच्छा बनाने की आवश्यकता है। इसके अलावा, ब्लूबर्ड के प्रोमिसिफ़ाइएल के साथ उपयोग करने के लिए अभी भी बहुत सारे अन्य गैर-प्रांतीय इंटरफेस। लेकिन, धीरे-धीरे हर नई परियोजना में ब्लूबर्ड को तुरंत हड़पने के कारण नोड के रूप में लुप्त हो रहे हैं। खुद ही अपने अंतर्निहित वादे के समर्थन में बीफ खाते हैं।
jfriend00
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.