在$ http响应拦截器中使用$ state.go

时间:2015-11-08 08:39:20

标签: javascript angularjs angular-ui-router

我正在尝试使用http拦截器接收禁止或未经授权的http请求时进行状态导航,但我收到了$ state.go承诺错误

Error: transition superseded

这是我的responseError拦截器:

angular.module('starter')

.factory('httpResponseInterceptor', function($injector) {
    return {
        responseError: function(errorResponse) {

            var loginParams = {
                info: true,
                reason: 'Please login.',
                title: errorResponse.data
            };
            var $state = $injector.get('$state');

            switch (errorResponse.status) {
                case 403:
                    $state.go('login', loginParams).then(function() {}, function(res) {
                        console.log(res);
                    });
                    break;
                case 401:
                    $injector.get('$state').go('login', loginParams);
                    break;
            }

            return errorResponse;
        }
    };
});

在这种情况下有没有办法使用拦截器? 在$ state.go周围包含超时将会解决这个问题

3 个答案:

答案 0 :(得分:2)

首先,这不是拦截器执行UI操作的工作。应该有一个AuthService / Provider / Controller,您应该在其中发送拦截器捕获的数据,并根据该数据,在那里采取必要的操作。您可以使用事件系统或调用服务中的方法。

这可能无法解决您的问题,但它将解决您未来的挑战。

来自克卢日的问候。

答案 1 :(得分:0)

我认为问题是,你可能已经处于状态转换状态,但错误拦截器启动后再尝试进行另一次转换。

我总是明确拒绝错误拦截器捕获的当前解析的承诺:

而不是$q你应该在拦截器中注入return $q.reject(errorResponse);服务并执行{{1}}

答案 2 :(得分:0)

@FlorianTopf说,你可能已经处于状态转换期。您可以考虑 $ stateChangeError 事件:

$rootScope.$on('$stateChangeError',
        function(event, toState, toParams, fromState, fromParams, error) {
            console.log(event, toState, fromState, error);
            if (something) {
                $state.go('error', toParams, {
                    reload: false
                });
            }
        });