सिर्फ कॉलबैक का वादा नहीं कर रहे हैं?


430

मैं कुछ वर्षों के लिए जावास्क्रिप्ट विकसित कर रहा हूं और मुझे वादों के बारे में समझ नहीं है।

ऐसा लगता है जैसे मैं कर रहा हूँ सब बदल रहा है:

api(function(result){
    api2(function(result2){
        api3(function(result3){
             // do work
        });
    });
});

जो मैं किसी भी तरह के लिए async जैसे एक पुस्तकालय का उपयोग कर सकता है, जैसे कुछ

api().then(function(result){
     api2().then(function(result2){
          api3().then(function(result3){
               // do work
          });
     });
});

जो अधिक कोड और कम पठनीय है। मुझे यहाँ कुछ भी हासिल नहीं हुआ, यह अचानक जादुई रूप से 'फ्लैट' भी नहीं है। वादों में चीजों को बदलने का जिक्र नहीं।

तो, यहां वादों के बारे में क्या बड़ा उपद्रव है?


11
ऑन-विषय : Html5Rocks पर वादों के बारे में एक बहुत जानकारीपूर्ण लेख है: html5rocks.com/en/tutorials/es6/promises
ComFreek

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

@Esailija ठीक है, आपकी लेट बात ने मुझे आश्वस्त किया। मैंने अन्य उत्तर को स्वीकार कर लिया है, हालांकि मुझे लगता है कि बर्गी का व्यक्ति वास्तव में कुछ अच्छा (और अलग) अंक भी उठाता है।
बेंजामिन ग्रुएनबाम

@Esailija "मुझे वादों का उपयोग करने के लिए क्या आश्वस्त किया गया था जैसा कि ऑस्कर के उत्तर में वर्णित DSL पहलू था" << "DSL" क्या है? और "DSL पहलू" क्या है जिसका आप उल्लेख कर रहे हैं?
5

1
@monsto: डीएसएल: डोमेन स्पेसिफिक लैंग्वेज, एक ऐसी भाषा जिसे जानबूझकर किसी सिस्टम के किसी विशेष उपसमुच्चय में प्रयोग किया जाता है (जैसे कि डेटाबेस से बात करने के लिए SQL या ORM, पैटर्न खोजने के लिए regex, आदि)। इस संदर्भ में "डीएसएल" प्रॉमिस एपीआई है, जो यदि आप अपने कोड को ऑस्कर के तरीके से जोड़ते हैं, तो लगभग सिंटैक्टिक शुगर की तरह है जो कि एसिंक्स संचालन के विशेष संदर्भ को संबोधित करने के लिए जावास्क्रिप्ट को पूरक करता है। वादे कुछ मुहावरे बनाते हैं जो प्रोग्रामर को इस तरह की संरचनाओं के कुछ हद तक मायावी मानसिक प्रवाह को आसानी से समझने की अनुमति देने के लिए डिज़ाइन की गई लगभग एक भाषा में बदल देते हैं।
माइकल एकोका

जवाबों:


631

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

api().then(function(result){
    return api2();
}).then(function(result2){
    return api3();
}).then(function(result3){
     // do work
});

निश्चित रूप से, बहुत कम कोड नहीं है, लेकिन बहुत अधिक पठनीय है।

लेकिन यह अंत नहीं है। आइए सच्चे लाभों की खोज करें: यदि आप किसी भी चरण में किसी भी त्रुटि के लिए जांचना चाहते हैं तो क्या होगा? यह कॉलबैक के साथ करना नरक होगा, लेकिन वादों के साथ, केक का एक टुकड़ा है:

api().then(function(result){
    return api2();
}).then(function(result2){
    return api3();
}).then(function(result3){
     // do work
}).catch(function(error) {
     //handle any error that may occur before this point
});

एक try { ... } catchब्लॉक के रूप में बहुत सुंदर ।

और भी बेहतर:

api().then(function(result){
    return api2();
}).then(function(result2){
    return api3();
}).then(function(result3){
     // do work
}).catch(function(error) {
     //handle any error that may occur before this point
}).then(function() {
     //do something whether there was an error or not
     //like hiding an spinner if you were performing an AJAX request.
});

और भी बेहतर: अगर उन 3 कॉल करने के लिए क्या api, api2, api3एक साथ चला सकते हैं (उदाहरण के लिए यदि वे AJAX कॉल थे) लेकिन आप तीन के लिए प्रतीक्षा करने की जरूरत है? वादों के बिना, आपको किसी प्रकार का काउंटर बनाना होगा। वादों के साथ, ES6 अंकन का उपयोग करते हुए, केक का एक और टुकड़ा और बहुत साफ है:

Promise.all([api(), api2(), api3()]).then(function(result) {
    //do work. result is an array contains the values of the three fulfilled promises.
}).catch(function(error) {
    //handle the error. At least one of the promises rejected.
});

आशा है कि अब आप एक नई रोशनी में वादे देखेंगे।


124
उन्होंने वास्तव में इसे "प्रॉमिस" नाम नहीं दिया है। "भविष्य" कम से कम 100x बेहतर है।
पचेरियर

12
@Pacerier क्योंकि भविष्य jQuery द्वारा दागी नहीं था?
एसेलीजा ३१'१५

5
वैकल्पिक पैटर्न (वांछित के आधार पर: एपीआई ()। फिर (एपीआई 2)। तब (एपीआई 3)। तब (doWork); अर्थात, यदि एपीआई 2 / एपी 3 कार्य अंतिम चरण से इनपुट लेते हैं, और नए वादों को वापस करते हैं, तो वे केवल अतिरिक्त लपेटे बिना जंजीर किया जा सकता है। यह है, वे रचना करते हैं।
Dtipson

1
अगर वहाँ async ऑपरेटिंग है api2और api3क्या है? .thenएक बार केवल उन async संक्रियाओं को पूरा करने के बाद अंतिम कहा जाएगा?
NiCk न्यूमैन

8
आपने मुझे क्यों टैग किया? मैंने सिर्फ व्याकरण को थोड़ा तय किया। मैं जेएस विशेषज्ञ नहीं हूं। :)
स्कॉट आर्किसेवस्की

169

हां, वादे अतुल्यकालिक कॉलबैक हैं। वे कुछ भी नहीं कर सकते हैं जो कॉलबैक नहीं कर सकते हैं, और आप समान समस्याओं का सामना करते हैं अतुल्यकालिक के साथ सादे कॉलबैक के साथ।

हालाँकि, वादे केवल कॉलबैक से अधिक हैं । वे एक बहुत शक्तिशाली अमूर्त हैं, कम त्रुटि वाले बायलरप्लेट के साथ क्लीनर और बेहतर, कार्यात्मक कोड की अनुमति देते हैं।

तो मुख्य विचार क्या है?

वादे एक एकल (अतुल्यकालिक) संगणना के परिणाम का प्रतिनिधित्व करने वाली वस्तुएं हैं। वे उस परिणाम को केवल एक बार हल करते हैं । इसका कुछ मतलब है:

वादे एक पर्यवेक्षक पैटर्न लागू:

  • आपको कॉलबैक को जानने की आवश्यकता नहीं है जो कार्य पूरा होने से पहले मूल्य का उपयोग करेगा।
  • अपने कार्यों के तर्क के रूप में कॉलबैक की अपेक्षा करने के बजाय, आप आसानी से returnएक वादा वस्तु कर सकते हैं
  • वादा मूल्य को संग्रहीत करेगा, और आप जब चाहें पारदर्शी रूप से कॉलबैक जोड़ सकते हैं। रिजल्ट मिलने पर इसे बुलाया जाएगा। "पारदर्शिता" का तात्पर्य है कि जब आपके पास एक वादा होता है और इसमें कॉलबैक जोड़ा जाता है, तो इससे आपके कोड पर कोई फर्क नहीं पड़ता है कि क्या परिणाम अभी तक आया है - एपीआई और अनुबंध समान हैं, कैशिंग / स्मरण को बहुत आसान करते हैं।
  • आप आसानी से कई कॉलबैक जोड़ सकते हैं

वादे chainable हैं ( monadic , अगर आप चाहते हैं ):

  • यदि आपको उस प्रतिमान को बदलने की आवश्यकता है, जो एक प्रतिज्ञा का प्रतिनिधित्व करता है, तो आप प्रतिज्ञा पर एक परिवर्तन कार्य का नक्शा बनाते हैं और एक नया वादा वापस करते हैं जो रूपांतरित परिणाम का प्रतिनिधित्व करता है। आप इसे किसी भी तरह से उपयोग करने के लिए मूल्य नहीं प्राप्त कर सकते हैं, लेकिन आप वादा के संदर्भ में परिवर्तन को आसानी से उठा सकते हैं । कोई बॉयलरप्लेट कॉलबैक नहीं।
  • यदि आप दो एसिंक्रोनस कार्यों को चेन करना चाहते हैं, तो आप .then()विधि का उपयोग कर सकते हैं । पहले परिणाम के साथ कॉल करने के लिए कॉलबैक लगेगा, और कॉलबैक रिटर्न के वादे के परिणाम के लिए एक वादा करता है।

जटिल लगता है? एक कोड उदाहरण के लिए समय।

var p1 = api1(); // returning a promise
var p3 = p1.then(function(api1Result) {
    var p2 = api2(); // returning a promise
    return p2; // The result of p2 …
}); // … becomes the result of p3

// So it does not make a difference whether you write
api1().then(function(api1Result) {
    return api2().then(console.log)
})
// or the flattened version
api1().then(function(api1Result) {
    return api2();
}).then(console.log)

चपटे जादुई रूप से नहीं आते हैं, लेकिन आप इसे आसानी से कर सकते हैं। आपके भारी नेस्टेड उदाहरण के लिए, (पास) समकक्ष होगा

api1().then(api2).then(api3).then(/* do-work-callback */);

यदि इन विधियों के कोड को देखने से समझने में मदद मिलती है, तो यहां कुछ ही लाइनों में सबसे बुनियादी वादा काम है

वादों को लेकर क्या बड़ा उपद्रव है?

वादा अमूर्त कार्यों की बेहतर बेहतर क्षमता की अनुमति देता है। उदाहरण के लिए, thenचेनिंग के लिए अगला , दall फ़ंक्शन कई समानांतर प्रतीक्षा वाले वादों के संयुक्त परिणाम के लिए एक वादा करता है।

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

वादों में चीजों को बदलने का जिक्र नहीं।

यह वास्तव में अच्छे वादे वाले पुस्तकालयों के साथ काफी तुच्छ है, देखें कि मैं मौजूदा कॉलबैक एपीआई को वादों में कैसे बदलूं?


हाय बर्गी, क्या आपके पास इस एसओ प्रश्न को जोड़ने के लिए कुछ दिलचस्प होगा? stackoverflow.com/questions/22724883/…
सेबस्टियन लॉबर

1
@ एसबेस्टियन: मुझे स्काला (अभी तक) के बारे में ज्यादा जानकारी नहीं है, और मैं केवल वही दोहरा सकता हूं जो बेंजामिन ने कहा था :-)
बर्गी

3
बस थोड़ी सी टिप्पणी: आप उपयोग नहीं कर सकते हैं .then(console.log), क्योंकि कंसोल.लॉग कंसोल संदर्भ पर निर्भर करता है। इस तरह यह एक अवैध आह्वान त्रुटि का कारण बनेगा। संदर्भ का उपयोग करना console.log.bind(console)या x => console.log(x)बांधना।
तमसा हेगड़ेस

3
@hege_hegedus: ऐसे वातावरण हैं जहाँ consoleविधियाँ पहले से ही बाध्य हैं। और हां, मैंने केवल यह कहा है कि दोनों घोंसले का व्यवहार समान है, न कि उनमें से कोई भी काम करेगा :-P
बर्गी

1
वह महान था। यह वही है जो मुझे चाहिए था: कम कोड और अधिक व्याख्या। धन्यवाद।
एडम पैटरसन

21

पहले से ही स्थापित जवाबों के अलावा, ES6 तीर फ़ंक्शन के साथ एक छोटे से चमकदार छोटे नीले बौने को सीधे लाल विशाल में बदल देता है। यह एक सुपरनोवा में गिरने वाला है:

api().then(result => api2()).then(result2 => api3()).then(result3 => console.log(result3))

जैसा कि ओलिगोफ़्रेन ने कहा, आपी कॉल के बीच तर्क के बिना आपको अनाम आवरण कार्यों की आवश्यकता नहीं है:

api().then(api2).then(api3).then(r3 => console.log(r3))

और अंत में, यदि आप एक सुपरमेसिव ब्लैक होल स्तर तक पहुंचना चाहते हैं, तो वादे का इंतजार किया जा सकता है:

async function callApis() {
    let api1Result = await api();
    let api2Result = await api2(api1Result);
    let api3Result = await api3(api2Result);

    return api3Result;
}

9
"ES6 साथ तीर कार्यों वादे सीधे लाल दैत्य में एक विनय चमक छोटे ब्लू स्टार से बारी है जो सुपरनोवा में पतन के बारे में है।" अनुवाद: संयोजन ES6 तीर वादे के साथ काम करता है है भयानक :)
user3344977

3
यह एक ब्रह्मांडीय तबाही की तरह वादे करता है, जो मुझे नहीं लगता कि आपका इरादा था।
माइकल मैकगिनिस

आप में तर्कों का उपयोग नहीं कर रहे हैं apiXतरीकों, आप के रूप में अच्छी पूरी तरह तीर कार्यों को छोड़ सकता है: api().then(api2).then(api3).then(r3 => console.log(r3))
ओलिवोफ्रेन

@MichaelMcGinnis - एक सुस्त कॉलबैक नरक पर वादों का लाभकारी प्रभाव अंतरिक्ष के एक अंधेरे कोने में एक विस्फोट सुपरनोवा जैसा है।
जॉन वीज़

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

15

उपरोक्त भयानक उत्तरों के अलावा, 2 और बिंदु जोड़े जा सकते हैं:

1. शब्दार्थ अंतर:

निर्माण पर वादे पहले से ही हल किए जा सकते हैं। इसका मतलब है कि वे घटनाओं के बजाय स्थितियों की गारंटी देते हैं । यदि वे पहले से ही हल हो गए हैं, तो इसके लिए पारित समाधान को अभी भी कहा जाता है।

इसके विपरीत, कॉलबैक घटनाओं को संभालता है। इसलिए, यदि आप जिस ईवेंट में रुचि रखते हैं, वह कॉलबैक पंजीकृत होने से पहले हुई है, तो कॉलबैक नहीं कहा जाता है।

2. नियंत्रण का उलटा

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

एक स्पष्टीकरण के लिए जावास्क्रिप्ट इवेंट लूप देखें ।

साथ वादे , नियंत्रण बुला कार्यक्रम के साथ रहता है। यदि हम वादा वस्तु को संग्रहीत करते हैं तो .then () विधि को किसी भी समय बुलाया जा सकता है


1
मुझे पता नहीं क्यों लेकिन यह एक बेहतर जवाब की तरह लगता है।
radiantshaw

13

अन्य जवाबों के अलावा, ES2015 सिंटेक्स, वादों के साथ मूल रूप से मिश्रित होता है, और भी अधिक बॉयलरप्लेट कोड को कम करता है:

// Sequentially:
api1()
  .then(r1 => api2(r1))
  .then(r2 => api3(r2))
  .then(r3 => {
      // Done
  });

// Parallel:
Promise.all([
    api1(),
    api2(),
    api3()
]).then(([r1, r2, r3]) => {
    // Done
});

5

वादे कॉलबैक नहीं हैं, दोनों प्रोग्रामिंग मुहावरे हैं जो कि एसिंक्स प्रोग्रामिंग की सुविधा देते हैं। कोरटाइन या जनरेटर का उपयोग करके प्रोग्रामिंग की एक एसिंक्स / प्रतीक्षा-शैली का उपयोग करना जो वादे लौटाता है, इसे 3 ऐसा मुहावरा माना जा सकता है। विभिन्न प्रोग्रामिंग भाषाओं (जावास्क्रिप्ट सहित) में इन मुहावरों की तुलना यहाँ है: https://github.com/KjellSchubert/promise-future-task


4

नहीं बिलकुल नहीं।

कॉलबैक केवल जावास्क्रिप्ट में कार्य हैं हैं जिन्हें कॉल किया जाना है और फिर किसी अन्य फ़ंक्शन के निष्पादन के बाद निष्पादित किया जाता है। तो यह कैसे होता है?

दरअसल, जावास्क्रिप्ट में, फ़ंक्शन को ऑब्जेक्ट के रूप में माना जाता है और इसलिए सभी अन्य ऑब्जेक्ट्स के रूप में, यहां तक ​​कि फ़ंक्शन को अन्य फ़ंक्शन के तर्क के रूप में भी भेजा जा सकता है । सबसे आम और सामान्य उपयोग के मामले के बारे में सोच सकते हैं कि जावास्क्रिप्ट में setTimeout () फ़ंक्शन है।

वादे कुछ भी नहीं हैं लेकिन कॉलबैक के साथ ऐसा ही करने की तुलना में अतुल्यकालिक कोड को संभालने और संरचित करने का एक बहुत अधिक सुधार किया गया दृष्टिकोण है।

निर्माण कार्य में वादा दो कॉलबैक प्राप्त करता है: समाधान और अस्वीकार। वादों के अंदर की ये कॉलबैक हमें त्रुटि से निपटने और सफलता के मामलों में ठीक-ठाक नियंत्रण प्रदान करती है। समाधान कॉलबैक का उपयोग तब किया जाता है जब वादे का निष्पादन सफलतापूर्वक किया जाता है और त्रुटि मामलों को संभालने के लिए कॉलबैक का उपयोग किया जाता है।


2

कॉलबैक पर कोई वादे सिर्फ रैपर नहीं हैं

उदाहरण आप नोड जेएस के साथ जावास्क्रिप्ट मूल वादों का उपयोग कर सकते हैं

my cloud 9 code link : https://ide.c9.io/adx2803/native-promises-in-node

/**
* Created by dixit-lab on 20/6/16.
*/

var express = require('express');
var request = require('request');   //Simplified HTTP request client.


var app = express();

function promisify(url) {
    return new Promise(function (resolve, reject) {
    request.get(url, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        resolve(body);
    }
    else {
        reject(error);
    }
    })
    });
}

//get all the albums of a user who have posted post 100
app.get('/listAlbums', function (req, res) {
//get the post with post id 100
promisify('http://jsonplaceholder.typicode.com/posts/100').then(function (result) {
var obj = JSON.parse(result);
return promisify('http://jsonplaceholder.typicode.com/users/' + obj.userId + '/albums')
})
.catch(function (e) {
    console.log(e);
})
.then(function (result) {
    res.end(result);
}
)

})


var server = app.listen(8081, function () {

var host = server.address().address
var port = server.address().port

console.log("Example app listening at http://%s:%s", host, port)

})


//run webservice on browser : http://localhost:8081/listAlbums

0

जावास्क्रिप्ट प्रॉमिस वास्तव में कॉलबैक फ़ंक्शंस का उपयोग यह निर्धारित करने के लिए करते हैं कि एक प्रॉमिस हल होने या अस्वीकार किए जाने के बाद क्या करना है, इसलिए दोनों मौलिक रूप से अलग नहीं हैं। वादों के पीछे मुख्य विचार कॉलबैक लेना है - विशेष रूप से नेस्टेड कॉलबैक जहां आप एक प्रकार की क्रियाएं करना चाहते हैं, लेकिन यह अधिक पठनीय होगा।


0

वादे का पालन:

जेएस में हम वादों में अतुल्यकालिक संचालन (जैसे डेटाबेस कॉल, AJAX कॉल) लपेट सकते हैं। आमतौर पर हम पुनर्प्राप्त डेटा पर कुछ अतिरिक्त तर्क चलाना चाहते हैं। जेएस वादों में हैंडलर फ़ंक्शन होते हैं जो अतुल्यकालिक संचालन के परिणाम को संसाधित करते हैं। हैंडलर फ़ंक्शन में उनके भीतर अन्य अतुल्यकालिक संचालन भी हो सकते हैं जो पिछले अतुल्यकालिक संचालन के मूल्य पर भरोसा कर सकते हैं।

एक वादा हमेशा 3 राज्यों निम्नलिखित है:

  1. लंबित: हर वादे की प्रारंभिक अवस्था, न तो पूरी की गई और न ही खारिज की गई।
  2. पूरा: ऑपरेशन सफलतापूर्वक पूरा हुआ।
  3. अस्वीकृत: ऑपरेशन विफल।

एक लंबित वादा एक मूल्य के साथ हल / भरा या अस्वीकार किया जा सकता है। फिर निम्नलिखित हैंडलर तरीके जो तर्क के रूप में कॉलबैक लेते हैं:

  1. Promise.prototype.then() : जब वादा हल हो जाएगा तो इस फ़ंक्शन का कॉलबैक तर्क कहा जाएगा।
  2. Promise.prototype.catch() : जब वादे को अस्वीकार कर दिया जाता है तो इस फ़ंक्शन का कॉलबैक तर्क कहा जाएगा।

यद्यपि उपरोक्त तरीकों से कौशल को कॉलबैक तर्क मिलते हैं, वे केवल कॉलबैक का उपयोग करने की तुलना में बहुत बेहतर हैं यहां एक उदाहरण है जो बहुत कुछ स्पष्ट करेगा:

उदाहरण

function createProm(resolveVal, rejectVal) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (Math.random() > 0.5) {
                console.log("Resolved");
                resolve(resolveVal);
            } else {
                console.log("Rejected");
                reject(rejectVal);
            }
        }, 1000);
    });
}

createProm(1, 2)
    .then((resVal) => {
        console.log(resVal);
        return resVal + 1;
    })
    .then((resVal) => {
        console.log(resVal);
        return resVal + 2;
    })
    .catch((rejectVal) => {
        console.log(rejectVal);
        return rejectVal + 1;
    })
    .then((resVal) => {
        console.log(resVal);
    })
    .finally(() => {
        console.log("Promise done");
    });

  • CreateProm फ़ंक्शन 1 सेकंड के बाद एक यादृच्छिक Nr के आधार पर एक वादे को हल या अस्वीकृत करता है
  • यदि वादा हल किया thenजाता है तो पहली विधि को कॉल किया जाता है और कॉलबैक के तर्क के रूप में हल किया गया मान पारित किया जाता है
  • यदि वादे को अस्वीकार कर दिया जाता है तो पहला catchतरीका कहा जाता है और खारिज किए गए मूल्य को एक तर्क के रूप में पारित किया जाता है
  • catchऔर thenतरीकों वापसी का वादा किया है कि हम उन्हें क्यों श्रृंखला कर सकते हैं। वे किसी भी दिए गए मान को Promise.resolveऔर किसी भी फेंके गए मान ( throwकीवर्ड का उपयोग करके ) में लपेटते हैं Promise.reject। इसलिए लौटाया गया कोई भी मूल्य एक वादा में बदल जाता है और इस वादे पर हम फिर से एक हैंडलर फ़ंक्शन को कॉल कर सकते हैं।
  • वादा चेन हमें नेस्टेड कॉलबैक की तुलना में अधिक ठीक ट्यून नियंत्रण और बेहतर अवलोकन देते हैं। उदाहरण के लिए catchविधि catchहैंडलर से पहले हुई सभी त्रुटियों को संभालती है ।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.