2014-06-27 3 views
59

मैं कोणीय $q सेवा और इसकी संबंधित वस्तुओं और एपीआई पर एक संभाल पाने की कोशिश कर रहा हूं। जब मैं अपने कंसोल में वस्तुओं को देखने मैं देख रहा हूँ:

var deferred = $q.defer() 

...(and then from console inspection)... 

$q: Object {defer: function, reject: function, when: function, all: function} 

deferred: Object {resolve: function, reject: function, notify: function, promise: Object} 

deferred.promise: Object {then: function, catch: function, finally: function} 

यह कुछ सवाल उठता है:

  1. $q.reject() और deferred.reject() के बीच क्या अंतर है? प्रत्येक का उपयोग कब करें?
  2. में errorFn और में deferred.promise.catch(catchFn) में क्या संबंध है?
  3. यदि मेरे पास घोंसला वाले वादे का गुच्छा है और एक त्रुटि होती है, तो क्या बाहरीतम catch() फ़ंक्शन हमेशा कॉल किया जाएगा? क्या होगा यदि घोंसले के वादे में से एक को कैच फ़ंक्शन भी परिभाषित किया गया हो? क्या वह बाहरी पकड़ को निष्पादित करने से रोक देगा?

धन्यवाद।

उत्तर

86

1) $q.reject() स्थगित करने के लिए एक शॉर्टकट है और फिर इसे तुरंत अस्वीकार कर दिया गया है; मैं अक्सर एक त्रुटि में इसका उपयोग करता हूं अगर मैं त्रुटि को संभाल नहीं सकता।

promise. 
    then(function(result){ 
     // handle success 
     return result; 
    }, function errorHandler1(error){ 
     // handle error, exactly as if this was a separate catch in the chain. 

    }).catch(function errorHandler2(error){ 
     // handle errors from errorHandler1 
    }); 

3) यह वह जगह है जहाँ है:

2) कुछ भी नहीं, promise.catch(errorFn)promise.then(null, errorFn) के लिए बस वाक्यात्मक चीनी, है, तो आप निम्नलिखित की तरह कोड लिख सकते हैं बस $http सेवा की सफलता और त्रुटि तरीकों की तरह $ q.reject काम में आ सकता है:

promise. 
    catch(function(error){ 
     //Decide you can't handle the error 
     return $q.reject(error); //This forwards the error to the next error handler; 
    }).catch(function(error){ 
     // Here you may handle the error or reject it again. 
     return 'An error occurred'; 
     //Now other errorFn in the promise chain won't be called, 
     // but the successFn calls will. 
    }).catch(function(error){ 
     // This will never be called because the previous catch handles all errors. 
    }).then(function(result){ 
     //This will always be called with either the result of promise if it was successful, or 
     //'An error occured' if it wasn't 
    }); 
+0

संक्षिप्त उत्तर के लिए धन्यवाद। वे बहुत स्पष्ट हैं।फिर भी संख्या # 2 पर अटक गया। अपने उदाहरण कोड को मानें कि सफलतापूर्वक आपके कॉल में एफएन और त्रुटि दोनों को()। पकड़ने के लिए अब कौन सी परिस्थितियों में चलेंगे? – lostdorje

+0

मैंने अपना जवाब 2 में अपडेट किया)। पकड़ विधि बिल्कुल उस कार्य के दूसरे तर्क के समान ही है। promise.catch (errorFn) वादा करने के समान है। फिर (शून्य, त्रुटि एफएन)। – dustyrockpyle

+1

यदि कोई व्यक्ति '$ q' का उपयोग कब करना है, तो मुझे यह लेख बहुत उपयोगी लगता है http://www.codelord.net/2015/09/24/$q-dot-defer-youre-doing-it-wrong / – Chris

4

ठीक है यह वादे से मेरा लेना है।

  1. $q.reject(reason) तर्क के रूप में पारित कारण के साथ एक अस्वीकार वादा देता है। अस्वीकार करें एक मौजूदा व्यक्ति को अस्वीकार कर दिया गया है कि इसकी प्रक्रिया समाप्त हो गई है या नहीं।

  2. errorFn लॉन्च हो जाता है जब एक वादा खारिज कर दिया जाता है और इसका तर्क यह कारण है कि इसे अस्वीकार कर दिया गया था। कैच को तब बुलाया जाता है जब वादा प्रक्रिया के अंदर एक त्रुटि को उचित रूप से संभालने और अपवाद को बढ़ाने का वादा नहीं किया जाता था और इसे अस्वीकार या पूरा नहीं किया जाता था।

  3. आपने घोंसले के वादे नहीं किए हैं, तो आपको इस मामले में नवीनतम कैच ब्लॉक को इससे पहले सब कुछ पकड़ना चाहिए यदि इसे संभालने के लिए कोई अन्य ब्लॉक निर्दिष्ट नहीं किया गया हो।

+0

# 2 आप देख रहे हैं अगर मैं अपने successFn या errorFn में हूं और मुझे एक फेंक नई त्रुटि (...) करते हैं तो catchFn चलेगा? मेरी समझ यह है कि मामला नहीं है। – lostdorje

+0

हैंडलर में या प्रक्रिया में हो सकता है। निश्चित रूप से यह प्रक्रिया में पकड़ेगा लेकिन मुझे लगता है कि हैनल्डर भी –

+0

बात यह है कि प्रक्रिया में त्रुटियां हो सकती हैं जो वादे को किसी भी राज्य में संक्रमण से रोक सकती हैं, इसलिए कैच ब्लॉक का उपयोग उन त्रुटियों का पता लगाने के लिए किया जाता है यदि उदाहरण के लिए पोर्स एक डिवीजन निष्पादित करते हैं और आप 0 से विभाजित करने का प्रयास करते हैं, आप एक अपवाद उठाएंगे जो कैश और हैंडल नहीं होने पर प्रक्रिया से बाहर निकल जाएगा। कैच ब्लॉक उसको प्राप्त करेगा और समान रूप से कार्य करेगा। हो सकता है कि मैं अपने प्रश्न को उछाल दूंगा क्योंकि मुझे लगता है कि यह सही व्यवहार है –

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