Tôi có trình xử lý lỗi toàn cầu cho ứng dụng góc của tôi được viết là $http interceptor
, nhưng tôi muốn tiến thêm một bước nữa. Những gì tôi muốn là cho mỗi cuộc gọi $http
không thành công (bị từ chối), bất kỳ "chuỗi" người tiêu dùng của lời hứa đầu tiên nên cố gắng giải quyết lỗi, và nếu nó là không được giải quyết (không bị bắt), thì tôi muốn xử lý lỗi toàn cầu để tiếp quản.Trình xử lý lỗi toàn cục chỉ bắt các lời hứa "không được xử lý"
Trường hợp sử dụng là, trình xử lý lỗi toàn cục của tôi hiển thị hình chữ nhật "alert box
" ở đầu màn hình. Nhưng tôi có một vài phương thức bật lên và tôi xử lý các lỗi một cách rõ ràng ở đó, hiển thị thông báo lỗi trong chính phương thức đó. Vì vậy, về cơ bản, bộ điều khiển phương thức này nên đánh dấu lời hứa bị từ chối là "xử lý". Nhưng kể từ khi kẻ đánh chặn luôn luôn có vẻ là người đầu tiên chạy trên một $http error
, tôi không thể tìm ra một cách để làm điều đó.
Đây là mã đánh chặn của tôi:
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');
})
Đây là mã đại khái về cách tôi mong đợi cuộc gọi lời hứa phương thức để trông giống như:
$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;
}
});
Bạn đã nghĩ đến việc thực hiện nó trên phía máy chủ để thay thế? Ngoài ra khi bạn nói nó nên * cố gắng để giải quyết *, bạn có thể cho một ví dụ về nó. – Rajesh
Không thể làm điều đó trên máy chủ, toàn bộ điểm là làm việc với phía khách hàng hứa hẹn. Bằng cách cố gắng giải quyết, tôi có nghĩa là trình xử lý lỗi toàn cầu phải là phần lưu trữ LAST cho các lỗi trong lời hứa http. Hiện tại nó là thứ đầu tiên chạy trên một lỗi. –