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)
你可以通过它捕获所有的回复$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)