2015-09-23 15 views
14

क्या कोई मुझे बता सकता है कि का उपयोग करते समय त्रुटि कॉलबैक बनाम catch फ़ंक्शन का उपयोग करने में कोई अंतर है या नहीं?वादा - त्रुटि कॉलबैक बनाम पकड़

उदा। कोड के दो स्निपेट कार्यात्मक रूप से बराबर हैं?

function doSomething0() { 
    var deferred = $q.defer(); 

    ... 

    return deferred.promise; 
} 

doSomething0() 
    .then(doSomething1) 
    .then(doSomething2) 
    .then(doSomething3) 
    .catch(function (err) { 
     // do something with `err` 
    }); 

बनाम

function doSomething0() { 
    var deferred = $q.defer(); 

    ... 

    return deferred.promise; 
} 

function errorHandler(err) { 
    // do something with `err` 
} 

doSomething0() 
    .then(doSomething1, errorHandler) 
    .then(doSomething2, errorHandler) 
    .then(doSomething3, errorHandler); 

यदि हां, तो क्यों एक दूसरे का उपयोग करें? यह बहुत उलझन में दिखता है और मेरी राय में अधिक कोड डुप्लिकेशंस की ओर जाता है?

+2

दूसरे संस्करण आप एक संकल्प लिया राज्य के साथ जारी रखने के लिए में वापस वादा लाने के लिए अनुमति देता है किसी भी त्रुटि या अस्वीकार किए गए वादे के अलावा कुछ भी लौटकर वैसे भी श्रृंखला। –

+2

और यदि त्रुटि हैंडलर खारिज कर देता है या अस्वीकार कर देता है, तो इसे तीन बार कहा जाएगा। –

उत्तर

4

दोनों एक ही चीज़ प्राप्त करेंगे, सिवाय इसके कि दूसरा errorHandler तीन बार (केवल एक बार के बजाय) चला सकता है। आप सही है कि यह कुछ कोड दोहराव लाता है, लेकिन यह भी आप का इलाज जो कुछ भी त्रुटि नहीं हुई और अपनी श्रृंखला के साथ जारी रखने के लिए अनुमति देता है:

function errorHandler(err) { 
    //log error, continue 
    return $q.resolve('default value or something'); 
} 

doSomething0() 
    .then(doSomething1, errorHandler) 
    .then(doSomething2, errorHandler) 
    .then(doSomething3, errorHandler); 
+0

धन्यवाद! मैं श्रृंखला के साथ ब्याज से कैसे जारी रहूंगा? या यह सिर्फ श्रृंखला के साथ जारी रहेगा? – keldar

+2

@keldar आपको बस अपने उदाहरण हैंडलर फ़ंक्शन से एक नया 'वादा' वापस करना होगा, जैसा ऊपर उपरोक्त उदाहरण में है! – Marcelo

+2

कोई वादा वापस करने की आवश्यकता नहीं है। आप बस एक मूल्य वापस कर सकते हैं। –

संबंधित मुद्दे