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



node.js promise (1)

पुरानी कहावत है कि आपको नौकरी के लिए सही उपकरण चुनना चाहिए। 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() हैंडलर के अंदर एक नया वादा करते हैं, .then() उस वादे को (वर्तमान वादा श्रृंखला में लिंक करने के लिए), तो ज्यादातर मामलों में, यह एक आकस्मिक बग है और ब्लूबर्ड आपको देगा उस प्रभाव के लिए एक चेतावनी। अन्य बिल्ट-इन ब्लूबर्ड चेतावनियाँ यहाँ वर्णित हैं

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

PromisifyAll

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

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

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

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

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

और, आपको अपने द्वारा उपयोग किए जाने वाले प्रत्येक एपीआई फ़ंक्शन के लिए मैन्युअल रूप से ऐसा करना होगा। यह स्पष्ट रूप से समझ में नहीं आता है। यह बॉयलरप्लेट कोड है। आपको एक उपयोगिता मिल सकती है जो आपके लिए यह काम करती है। Bluebird का 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
});

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

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

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





bluebird