2013-10-25 5 views
15

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

मुझे समझ में नहीं आता कि क्यों विफलता कॉलबैक की बजाय पकड़ को निष्पादित किया जाता है।

मैं क्या उम्मीद:

SomeAsyncService.getData().then(function (result) { 
    // The call is successful. 
    // Code in this block throws an error. 
}, function (error) { 
    // I expected to handle errors here. 
}); 

क्या अंत में काम किया।

SomeAsyncService.getData().then(function (result) { 
    // The call is successful. 
    // Code in this block throws an error. 
}).catch(function (error) { 
    // Where the error is actually caught. 
}); 

यदि वादे त्रुटियों को संभालने का एक और उचित तरीका है, तो मुझे बताएं।

उत्तर

16

दूसरा तर्क लगभग पहले कभी भी उपयोग करने के दौरान आवेदन कोड में शाब्दिक रूप से उपयोग नहीं किया जाना चाहिए। यह ज्यादातर विभिन्न कार्यान्वयन के बीच वादा पुस्तकालय अंतःक्रियाशीलता के बारे में है।

आपको हमेशा .catch का उपयोग करना चाहिए जबतक कि आपके पास विशेष रूप से कुछ अजीब कोने का मामला न हो जहां आपको .then(succcess, fail) की आवश्यकता हो।

The .then(success, fail) anti-pattern देखें।

इसके अलावा क्यू पुस्तकालय (एक कोणीय $ q पर आधारित है) has similar section in their readme

-1

तक AngularJS documentation for $q:

तरीके

तो (successCallback, errorCallback, notifyCallback) - की परवाह किए बिना जब वादा था या हल हो या अस्वीकार कर दिया जाएगा, तो कहता है एक सफलता की या परिणाम परिणामस्वरूप जल्द ही त्रुटि कॉलबैक असीमित रूप से उपलब्ध है।

.....

पकड़ (errorCallback) - promise.then के लिए आशुलिपि (शून्य, errorCallback) कोड तुम्हें तैनात की

दो टुकड़े समान हैं।

+0

पहले एक त्रुटियां पकड़ नहीं करता है, दूसरा एक है। – Jason

7

मुझे लगता है कि आप थोड़ा गलतफहमी कर रहे हैं कि काम कैसे वादा करता है।

आपके पहले कोड ब्लॉक में केवल एक वादा वस्तु है और यह SomeAsyncService.getData() है। त्रुटि कॉलबैक यहां नहीं कहा जाता है क्योंकि वह वादा हल हो जाता है।

दूसरे कोड ब्लॉक में वास्तव में 2 वादे ऑब्जेक्ट्स हैं जिनके साथ आप काम कर रहे हैं। ध्यान दें कि .then() "सफलता का वापसी मूल्य, त्रुटि कॉलबैक" के माध्यम से हल या अस्वीकार किया गया एक नया वादा देता है। तो क्या हो रहा है कि आप SomeAsyncService.getData().then(...) से लौटे दूसरे वादे से त्रुटि को पकड़ रहे हैं।

+0

क्या यह कहना सही होगा कि विफलता कॉलबैक केवल तभी निष्पादित होती है जब तत्काल पिछला वादा विफल हो जाता है लेकिन श्रृंखला में कोई वादा किसी त्रुटि को फेंकने पर पकड़ निष्पादित करता है? – Jason

+0

आप आंशिक रूप से सही हैं। यदि श्रृंखला में कोई पिछला वादा एक त्रुटि फेंकता है तो कैच निष्पादित हो जाएगा और त्रुटि पहले ही संभाल नहीं है। –

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