AngularJS:捕获所有响应状态500

Ben*_*lah 15 javascript angularjs

这似乎是一个奇怪的请求.我想知道是否有一种方法使用$ http拦截器来捕获响应状态为500的第一个URL,然后停止所有后续请求和进程并执行某些操作?

Zan*_*non 10

Thomas的回答是正确的,但目前已弃用此解决方案.你应该做这样的回答.

app.factory('errorInterceptor', function ($q) {

    var preventFurtherRequests = false;

    return {
        request: function (config) {

            if (preventFurtherRequests) {
                return;
            }

            return config || $q.when(config);
        },
        requestError: function(request){
            return $q.reject(request);
        },
        response: function (response) {
            return response || $q.when(response);
        },
        responseError: function (response) {
            if (response && response.status === 401) {
                // log
            }
            if (response && response.status === 500) {
                preventFurtherRequests = true;
            }

            return $q.reject(response);
        }
    };
});

app.config(function ($httpProvider) {
    $httpProvider.interceptors.push('errorInterceptor');    
});
Run Code Online (Sandbox Code Playgroud)


Tho*_*ons 9

你可以通过它捕获所有的回复$httpProvider.responseInterceptors.

要做到这一点,你必须创建一个像这样的工厂:

app.factory('SecurityHttpInterceptor', function($q) {
        return function (promise) {
            return promise.then(function (response) {
                return response;
            },
            function (response) {
                if (response.status === 500) {
                    //DO WHAT YOU WANT
                }
                return $q.reject(response);
            });
        };
    });
Run Code Online (Sandbox Code Playgroud)

在这个工厂中,如果500就做你想要的,你会得到响应状态.然后拒绝回复.

现在,你必须把工厂中responseInterceptors$httProvider你的配置模块,就像在:

app.config(function ($routeProvider, $httpProvider) {
    $routeProvider
        .when('/', {
            templateUrl: 'views/home.html',
            controller: 'HomeCtrl'
        })
        .otherwise({
            templateUrl: 'views/404.html'
        });

    $httpProvider.responseInterceptors.push('SecurityHttpInterceptor');
})
Run Code Online (Sandbox Code Playgroud)