我在我的一个控制器中有以下代码来优雅地处理401:
ChannelsService.query(function(response) {
$scope.channels = response;
}, function(error) {
if (error.status == 401) {
$state.go('login');
}
});
Run Code Online (Sandbox Code Playgroud)
和我的相应service:
myServices.factory('ChannelsService', function ($resource) {
return $resource('/channels', {}, {
query: { method: 'GET', isArray: true },
create: { method: 'POST' }
})
});
Run Code Online (Sandbox Code Playgroud)
我想知道如何全局处理401,这样我就不必将这个逻辑运用到每个控制器中.它是我需要的拦截器,如果是这样,有人可以共享一些代码吗?
谢谢
Wot*_*els 10
对于全球性的错误处理,验证,或任何形式的请求或响应的后处理同步或异步预处理的目的,是希望能够拦截请求他们交给服务器和响应之前,他们被移交给前启动这些请求的应用程序代码.拦截器利用promise API来满足同步和异步预处理的这种需求.
配置应用程序时,可以向$ httpProvider添加拦截器
app.config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push(function($q) {
return {
'responseError': function(rejection){
var defer = $q.defer();
if(rejection.status == 401){
console.dir(rejection);
}
defer.reject(rejection);
return defer.promise;
}
};
});
}]);
Run Code Online (Sandbox Code Playgroud)
正如名称已经暗示的那样,这将拦截每个请求并调用提供的函数(如果有)responseError(您也可以为成功的请求添加拦截器)
有关详细信息,请参阅$ http文档