我想实现的
如果$ http请求返回401错误,我想转换到某个状态(登录)。因此我创建了一个$ http拦截器。
问题
当我试图插入’$ state’到拦截器我得到一个循环依赖。为什么,我如何解决它?
码
//Inside Config function var interceptor = ['$location','$q','$state',function($location,$q,$state) { function success(response) { return response; } function error(response) { if(response.status === 401) { $state.transitionTo('public.login'); return $q.reject(response); } else { return $q.reject(response); } } return function(promise) { return promise.then(success,error); } }]; $httpProvider.responseInterceptors.push(interceptor);
修复
使用$ injector服务获取$ state服务的引用。
var interceptor = ['$location','$injector',$injector) { function success(response) { return response; } function error(response) { if(response.status === 401) { $injector.get('$state').transitionTo('public.login'); return $q.reject(response); } else { return $q.reject(response); } } return function(promise) { return promise.then(success,error); } }]; $httpProvider.responseInterceptors.push(interceptor);
原因
angular-ui-router将$ http服务作为依赖注入到$ TemplateFactory中,然后在分派拦截器时在$ httpProvider本身内创建一个对$ http的循环引用。
如果您尝试将$ http服务直接插入到这样的拦截器中,则会抛出相同的循环依赖性异常。
var interceptor = ['$location','$http',$http) {
关注点分离
循环依赖性异常可以指示应用程序中存在可能导致稳定性问题的混淆问题。如果你发现自己有这个异常,你应该花时间看看你的架构,以确保避免任何依赖,最终引用自己。