加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 注入$state(ui-router)到$http拦截器导致循环依赖

发布时间:2020-12-17 09:13:21 所属栏目:安全 来源:网络整理
导读:我想实现的 如果$ http请求返回401错误,我想转换到某个状态(登录)。因此我创建了一个$ http拦截器。 问题 当我试图插入’$ state’到拦截器我得到一个循环依赖。为什么,我如何解决它? 码 //Inside Config function var interceptor = ['$location','$q','
我想实现的

如果$ 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) {

关注点分离

循环依赖性异常可以指示应用程序中存在可能导致稳定性问题的混淆问题。如果你发现自己有这个异常,你应该花时间看看你的架构,以确保避免任何依赖,最终引用自己。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读