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

Javascript 在$http响应拦截器中使用$state.go,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,当使用http拦截器接收到禁止的或未经授权的http请求时,我尝试执行状态导航,但在$state.go承诺上收到一个错误 错误:转换被取代 这是我的响应错误拦截器: angular.module('starter') .factory('httpResponseInterceptor', function($injector) { return { responseError: function(errorResponse) { var log

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

错误:转换被取代

这是我的响应错误拦截器:

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周围包装一个超时将起到作用,但是我认为问题是,您可能已经处于状态转换中,但是错误拦截器会启动,然后您尝试执行另一个转换

我始终明确拒绝错误拦截器捕获的当前正在解析的承诺:

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;
        }
    };
});

而不是执行
返回errorResponse
您应该在拦截器中注入
$q
服务,并执行
返回$q.reject(errorResponse)

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

这也许不能解决你的问题,但可以解决你未来的挑战


克鲁伊的问候。

@FlorianTopf说,你可能已经处于状态转换阶段。您可以考虑<强> $StATeCuffeError < /强>事件:

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