मैं जो एक $http interceptor
रूप में लिखा है मेरी कोणीय अनुप्रयोग के लिए एक वैश्विक त्रुटि हैंडलर है, लेकिन मैं इसे एक कदम आगे ले करना चाहते हैं। क्या मैं चाहता हूँ प्रत्येक $http
कॉल कि विफल रहता है (अस्वीकार कर दिया है), किसी भी "श्रृंखलित" वादा के उपभोक्ताओं पहले, त्रुटि को हल करने का प्रयास करना चाहिए के लिए है और यदि यह अभी भी अनसुलझे (पकड़े नहीं) है, तो मैं चाहूँगा लेने के लिए वैश्विक त्रुटि हैंडलर।वैश्विक त्रुटि हैंडलर है कि केवल पकड़ता "बिना क्रिया" का वादा किया
उपयोग के मामले में, है मेरी वैश्विक त्रुटि हैंडलर स्क्रीन के शीर्ष पर एक ग्राउल "alert box
" को दर्शाता है। लेकिन मेरे पास कुछ मोडल हैं जो पॉप अप करते हैं, और मैं स्पष्ट रूप से त्रुटियों को संभालता हूं, जो मोडल में एक त्रुटि संदेश दिखाता है। इसलिए, अनिवार्य रूप से, इस मोडल नियंत्रक को अस्वीकार किए गए वादे को "संभाला" के रूप में चिह्नित करना चाहिए। लेकिन चूंकि इंटरसेप्टर हमेशा पहले एक $http error
पर चलाने के लिए हो रहा है, मैं यह करने के लिए एक तरह से समझ नहीं कर सकते हैं।
angular.module("globalErrors", ['angular-growl', 'ngAnimate'])
.factory("myHttpInterceptor", ['$q', '$log', '$location', '$rootScope', 'growl', 'growlMessages',
function ($q, $log, $location, $rootScope, growl, growlMessages) {
var numLoading = 0;
return {
request: function (config) {
if (config.showLoader !== false) {
numLoading++;
$rootScope.loading = true;
}
return config || $q.when(config)
},
response: function (response) {
if (response.config.showLoader !== false) {
numLoading--;
$rootScope.loading = numLoading > 0;
}
if(growlMessages.getAllMessages().length) { // clear messages on next success XHR
growlMessages.destroyAllMessages();
}
return response || $q.when(response);
},
responseError: function (rejection) {
//$log.debug("error with status " + rejection.status + " and data: " + rejection.data['message']);
numLoading--;
$rootScope.loading = numLoading > 0;
switch (rejection.status) {
case 401:
document.location = "/auth/login";
growl.error("You are not logged in!");
break;
case 403:
growl.error("You don't have the right to do this: " + rejection.data);
break;
case 0:
growl.error("No connection, internet is down?");
break;
default:
if(!rejection.handled) {
if (rejection.data && rejection.data['message']) {
var mes = rejection.data['message'];
if (rejection.data.errors) {
for (var k in rejection.data.errors) {
mes += "<br/>" + rejection.data.errors[k];
}
}
growl.error("" + mes);
} else {
growl.error("There was an unknown error processing your request");
}
}
break;
}
return $q.reject(rejection);
}
};
}]).config(function ($provide, $httpProvider) {
return $httpProvider.interceptors.push('myHttpInterceptor');
})
यह मैं कैसे मोडल वादा कॉल की तरह लग रहे करने के लिए उम्मीद थी की किसी न किसी तरह कोड है::
$http.get('/some/url').then(function(c) {
$uibModalInstance.close(c);
}, function(resp) {
if(resp.data.errors) {
$scope.errors = resp.data.errors;
resp.handled = true;
return resp;
}
});
आप सर्वर साइड पर यह बजाय लागू करने के बारे में सोचा है? इसके अलावा जब आप कहते हैं कि इसे * हल करने का प्रयास करना चाहिए, तो क्या आप इसका उदाहरण दे सकते हैं। – Rajesh
सर्वर पर ऐसा नहीं कर सकता है, पूरा बिंदु क्लाइंट पक्ष के वादे के साथ काम करना है। हल करने का प्रयास करके, मेरा मतलब है कि वैश्विक त्रुटि हैंडलर को http वादे में त्रुटियों के लिए अंतिम पकड़ होना चाहिए। वर्तमान में यह त्रुटि पर चलने वाली पहली बात है। –