角度アプリのグローバルエラーハンドラは$http interceptor
と書かれていますが、それ以上のステップを進めたいと思います。私が望むのは、失敗した(拒否された)各呼び出しのためのもので、約束の消費者は最初にエラーを解決しようとするべきであり、まだ解決されていない(捕らえられていない)引き継ぐグローバルエラーハンドラ。「処理されていない」約束を捉えるだけのグローバルエラーハンドラ
使用する場合、私のグローバルエラーハンドラは、画面の上部に唸り「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約束のエラーの最後のcatchallでなければならないということです。現在、エラーが発生したときに最初に実行されます。 –