Node.js में वादों को समझना


147

मैंने जो समझा है उसमें अतुल्यकालिक कोड को कॉल करने के तीन तरीके हैं:

  1. घटनाक्रम, उदाहरण के लिए request.on("event", callback);
  2. कॉलबैक, उदाहरण के लिए fs.open(path, flags, mode, callback);
  3. वादे

मुझे नोड-वादा पुस्तकालय मिला लेकिन मुझे नहीं मिला।

क्या कोई समझा सकता है कि सभी वादे क्या हैं और मुझे इसका उपयोग क्यों करना चाहिए?

इसके अलावा, इसे Node.js से क्यों हटाया गया?


यह लेख इसे अच्छी तरह से समझाता है। जब यह नोड में लागू होने योग्य हो जाता है। जेएस, फ्यूचर्स
शॉन किन्से

एक महान श्रृंखला है जिसका उपयोग मैंने अपना वादा वर्ग बनाने के लिए किया है: लेट्स मेक ए फ्रेमवर्क : प्रॉमिस इज़
टॉम विंटर

जवाबों:


91

नोड्स में वादा करता है। जेएस ने कुछ काम करने का वादा किया था और फिर अलग-अलग कॉलबैक थे जो कि सफलता और विफलता के साथ-साथ टाइमआउट को संभालने के लिए निष्पादित किए जाएंगे। नोड.जेएस में वादों के बारे में सोचने का एक और तरीका यह था कि वे एमिटर थे जो केवल दो घटनाओं का उत्सर्जन कर सकते थे: सफलता और त्रुटि।

वादों के बारे में अच्छी बात यह है कि आप उन्हें निर्भरता श्रृंखलाओं में जोड़ सकते हैं (वादा सी तभी करें जब प्रोमिस ए और प्रोमिस बी पूरा हो जाए)।

कोर नोड.जेएस से उन्हें हटाकर, इसने वादे के विभिन्न कार्यान्वयनों के साथ मॉड्यूल के निर्माण की संभावना पैदा की जो कोर के शीर्ष पर बैठ सकते हैं। इनमें से कुछ नोड-वादा और वायदा हैं


10
@ नहीं, यह नहीं है।
इवो ​​वेटजेल

98

चूँकि इस प्रश्न के अभी भी कई विचार हैं (जैसे मेरा) मैं उस ओर इशारा करना चाहता था:

  1. नोड-वादा मुझे मृत लगता है (अंतिम प्रतिबद्ध लगभग 1 वर्ष पहले था) और लगभग कोई परीक्षण नहीं है।
  2. वायदा दिखता है मेरे लिए बहुत फूला हुआ मॉड्यूल और बुरी तरह से प्रलेखित है (और मुझे लगता है कि नामकरण रिवाजों का सिर्फ बुरा कर रहे हैं)
  3. जाने का सबसे अच्छा तरीका क्यू फ्रेमवर्क प्रतीत होता है , जो सक्रिय और अच्छी तरह से प्रलेखित दोनों है।

9
इस github.com/medikoo/deferred को भी देखें , क्यू पहली में से एक है और यह निश्चित रूप से कई कार्यान्वयनों के लिए प्रेरणा है जो बाद में दिखाई दिए, लेकिन दुर्भाग्य से यह बहुत धीमा है और कुछ हिस्सों में "सैद्धांतिक" भी है, यह कुछ के साथ अच्छा नहीं खेलता है वास्तविक दुनिया परिदृश्य
Mariusz Nowak


23
2014 अपडेट - ब्लूबर्ड अब तक का सबसे तेज और सबसे अच्छा डिबगिंग क्षमताओं वाला है।
बेंजामिन ग्रुएनबाउम

19

एक वादा एक "बात" है जो बोलने के लिए एक ऑपरेशन के "अंतिम" परिणामों का प्रतिनिधित्व करता है। यहाँ ध्यान देने वाली बात यह है कि, यह तब होता है जब कुछ घटित होता है और आप को इस पर ध्यान केंद्रित करने की अनुमति देता है कि कुछ होने के बाद क्या होना चाहिए । इसके परिणामस्वरूप स्वच्छ, बनाए रखने योग्य कोड होगा जहां कॉलबैक के अंदर कॉलबैक में कॉलबैक होने के बजाय, आपका कोड कुछ हद तक दिखाई देगा:

 var request = new Promise(function(resolve, reject) {
   //do an ajax call here. or a database request or whatever.
   //depending on its results, either call resolve(value) or reject(error)
   //where value is the thing which the operation's successful execution returns and
   //error is the thing which the operation's failure returns.
 });

 request.then(function successHandler(result) {
   //do something with the result
 }, function failureHandler(error) {
  //handle
 });

वादों की युक्ति बताती है कि एक वादा है

then

पद्धति को एक नया वादा वापस करना चाहिए जो कि दिए गए सक्सेसहैंडलर या असफलता को पूरा करता है। इसका मतलब है कि आप एक साथ वादों की श्रृंखला बना सकते हैं जब आपके पास अतुल्यकालिक कार्यों का एक सेट होता है जिन्हें प्रदर्शन करने की आवश्यकता होती है और यह आश्वासन दिया जाता है कि संचालन की अनुक्रमण की गारंटी है जैसे कि आपने कॉलबैक का उपयोग किया था। इसलिए कॉलबैक के अंदर कॉलबैक के अंदर कॉलबैक पास करने के बजाय, जंजीर वादों वाला कोड इस तरह दिखता है:

var doStuff = firstAsyncFunction(url) {
                return new Promise(function(resolve, reject) {
                       $.ajax({
                        url: url,
                        success: function(data) {
                            resolve(data);
                        },
                        error: function(err) {
                             reject(err); 
                        } 
                  });
               };
doStuff
  .then(secondAsyncFunction) //returns a promise
  .then(thirdAsyncFunction); //returns a promise

वादों के बारे में अधिक जानने के लिए और वे सुपर कूल क्यों हैं, चेकआउट डोमिनिक का ब्लॉग: http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/


12

पाउचडीबी के लेखक के वादे पर यह नया ट्यूटोरियल शायद सबसे अच्छा मैंने कहीं भी देखा है। यह समझदारी से क्लासिक धोखेबाज़ गलतियों को शामिल करता है जो आपको सही उपयोग पैटर्न और यहां तक ​​कि कुछ विरोधी पैटर्न दिखाते हैं जो अभी भी आमतौर पर उपयोग किए जाते हैं - यहां तक ​​कि अन्य ट्यूटोरियल में भी !!

का आनंद लें!

PS मैंने इस प्रश्न के कुछ अन्य भागों का उत्तर नहीं दिया क्योंकि वे दूसरों द्वारा अच्छी तरह से कवर किए गए हैं।


इसके लिए मेरी एकमात्र माफी आपको उन्नत गलती # 4 के अंत में हास्य पढ़ने के लिए मजबूर कर रही है।
टोनी ओ'हागन

वास्तव में, ट्यूटोरियल में कोड जो वे एक एंटीपैटर्न होने का दावा करते हैं, उन्हें लूप और स्थिति के लिए नेस्टिंग की आवश्यकता होती है, और जैसा कि वे सुझाव देते हैं, उतना आसानी से चपटा नहीं किया जा सकता है।
बरगी

उन्नत गलती # 4 भी अलग-अलग दृष्टिकोणों की अधिक संख्या का उपयोग करके हल की जा सकती है, देखें। मैं .then () श्रृंखला में पिछले वादा परिणामों तक कैसे पहुंच सकता हूं? ( बंद पैटर्न वे सुझाव देते हैं कि बहुत लोकप्रिय नहीं लगते हैं)।
बरगी

मुझे लगता है कि यह लिंक-ओनली उत्तर बेहतर टिप्पणी होना चाहिए था। कृपया अपने उत्तर में उस लेख के कम से कम मुख्य बिंदुओं को यहाँ रखें।
बरगी

7

माइक टाल्टाय के पास वीडियो की एक श्रृंखला है , उनमें से प्रत्येक दस मिनट से भी कम समय का है, जिसमें बताया गया है कि विनजे प्रॉमिस पुस्तकालय कैसे काम करता है।

ये वीडियो काफी जानकारीपूर्ण हैं, और माइक कुछ अच्छी तरह से चुने गए कोड उदाहरणों के साथ प्रॉमिस एपीआई की शक्ति दिखाने का प्रबंधन करता है।

var twitterUrl = "http://search.twitter.com/search.json?q=windows";
var promise = WinJS.xhr({ url: twitterUrl });

 promise = promise.then(
     function (xhr) {
     },
     function (xhr) {
         // handle error
     });

अपवादों से कैसे निपटा जाता है इसका उपचार विशेष रूप से अच्छा है।

WinJs संदर्भों के बावजूद, यह एक सामान्य रुचि वीडियो श्रृंखला है, क्योंकि प्रोमिस एपीआई मोटे तौर पर अपने कई कार्यान्वयनों के समान है।

RSVP एक हल्का प्रॉमिस इम्प्लीमेंटेशन है जो प्रॉमिस / ए + टेस्ट सूट को पास करता है। मैं एपीआई को काफी पसंद करता हूं, क्योंकि यह शैली में WinJS इंटरफेस के समान है।

अद्यतन अप्रैल 2014

संयोग से, WinJS पुस्तकालय अब खुला स्रोत है


1
+1। यह पहला उदाहरण है जो मैंने देखा है जो मेरे लिए समझ में आता है और उपयोग करने के लिए सहज है। किसी भी तरह मेरा मस्तिष्क सभी deferredsऔर resolveऔर पार्स नहीं कर सकता लोकप्रिय क्यू पुस्तकालय प्रलेखन में deferred.promise.thenपूर्वनिर्धारित promiseActions। किसी भी मौका आप Node.js के लिए यह सीधा कुछ पता है ?
Redsandro

1
@noel उपरोक्त लिंक साझा करने के लिए धन्यवाद, यह वादों के लिए एक उत्कृष्ट परिचयात्मक श्रृंखला है, और मैं मानता हूं कि WinJS की बारीकियां अप्रासंगिक हैं क्योंकि समग्र दृष्टिकोण / विषय सार्वभौमिक है।
आर्केल्डन

अच्छा उदाहरण है। इसके अलावा मैंने आपका पहला लिंक तय किया था जो कि मृत था
stonedauwg

5

वादों का एक और लाभ यह है कि कॉलबैक के साथ इसे संभालने की कोशिश करने में त्रुटि हैंडलिंग और अपवाद फेंकना और पकड़ना बहुत बेहतर है।

Bluebird पुस्तकालय औजार वादों और तुम महान लंबे स्टैक ट्रेस देता है, बहुत तेजी से है, और ध्यान में न आया त्रुटियों के बारे में चेतावनी दी है। यह भी अधिक तेज़ है और http://bluebirdjs.com/docs/benmarks.html के अनुसार अन्य वादा पुस्तकालयों की तुलना में कम मेमोरी का उपयोग करता है


4

वास्तव में एक वादा क्या है?

एक वादा बस एक वस्तु है जो एक async ऑपरेशन के परिणाम का प्रतिनिधित्व करता है। एक वादा निम्नलिखित 3 राज्यों में से किसी में भी हो सकता है:

लंबित :: यह प्रारंभिक स्थिति है, इसका मतलब है कि वादा न तो पूरा किया गया है और न ही खारिज कर दिया गया है।

पूर्ति :: इसका मतलब है कि वादा पूरा हो गया है, इसका मतलब है कि वादे द्वारा दर्शाए गए मूल्य का उपयोग करने के लिए तैयार है।

अस्वीकृत :: इसका मतलब है कि संचालन विफल हो गया और इसलिए यह वादा पूरा नहीं कर सकता। राज्यों के अलावा, वादों से जुड़ी तीन महत्वपूर्ण इकाइयाँ हैं जिन्हें हमें वास्तव में समझने की आवश्यकता है

  1. निष्पादक कार्य :: निष्पादक कार्य, एसिंक्स ऑपरेशन को परिभाषित करता है जिसे निष्पादित करने की आवश्यकता होती है और जिसका परिणाम वादे द्वारा दर्शाया जाता है। जैसे ही वादा ऑब्जेक्ट को इनिशियलाइज़ किया जाता है, यह निष्पादन शुरू कर देता है।

  2. रिज़ॉल्यूशन :: रिज़ॉल्यूशन निष्पादक फ़ंक्शन के लिए दिया गया पैरामीटर है, और यदि निष्पादक सफलतापूर्वक चलता है तो इस रिज़ॉल्यूशन को परिणाम पास करना कहा जाता है।

  3. reject :: reject एक और पैरामीटर है जो निष्पादक फ़ंक्शन को दिया जाता है, और इसका उपयोग तब किया जाता है जब निष्पादक फ़ंक्शन विफल हो जाता है। विफलता का कारण अस्वीकार किया जा सकता है।

इसलिए जब भी हम एक वादा वस्तु बनाते हैं, तो हमें एक्ज़िक्यूटर, रिज़ॉल्यूशन और रिजेक्ट प्रदान करना होता है।

संदर्भ :: वादा करता है


0

मैं भी हाल ही में नोड्स में वादे देख रहा हूँ। तिथि करने के लिए जब। Js को इसकी गति और संसाधन उपयोग के कारण जाने का रास्ता लगता है, लेकिन q.js पर प्रलेखन ने मुझे बहुत बेहतर समझ दी। इसलिए जब विषय को समझने के लिए q.js डॉक्स का उपयोग करें।

जीथुब पर q.js रेडमी से :

यदि कोई फ़ंक्शन किसी मान को वापस नहीं कर सकता है या बिना किसी अपवाद के अपवाद को फेंक सकता है, तो इसके बजाय एक वादा वापस कर सकता है। एक वादा एक वस्तु है जो रिटर्न वैल्यू या फेंके गए अपवाद का प्रतिनिधित्व करता है जो फ़ंक्शन अंततः प्रदान कर सकता है। विलंबता को दूर करने के लिए किसी वादे का उपयोग किसी दूरस्थ वस्तु के लिए प्रॉक्सी के रूप में भी किया जा सकता है।


0

वादा वस्तु एक अतुल्यकालिक ऑपरेशन के पूरा होने या विफलता का प्रतिनिधित्व करती है।

तो एक वादा लागू करने के लिए, आपको दो भागों की आवश्यकता है: -

1. वादा बनाना:

वादे के निर्माता एक फ़ंक्शन को स्वीकार करता है जिसे निष्पादक कहा जाता है जिसमें 2 पैरामीटर होते हैं और अस्वीकार करते हैं।

function example(){
   return new Promise (function(resolve , reject){   //return promise object
      if(success){
         resolve('success');  //onFullfiled
      }else{
         reject('error');     //onRejected
      }
   })
}

2. हैंडलिंग वादा:

वादा ऑब्जेक्ट में वादे की वस्तुओं को संभालने के 3 तरीके हैं: -

1.Promise.prototype.catch (onRejected)

2.Promise.prototype.then (onFullfiled)

3.Promise.prototype.finally (onFullfiled, onRejected)

example.then((data) =>{
  //handles resolved data
  console.log(data); //prints success     
}).catch((err) => {
  //handles rejected error 
  console.log(err);  //prints error
})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.