2015-11-08 79 views
0

我尝试使用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周围的超时将做的伎俩,虽然

回答

0

我认为问题是,你可能已经处于状态转换,但错误拦截器踢,然后你尝试做另一个转换。

我总是明确地拒绝它是由错误拦截抓住当前解决承诺:

,而不是做return errorResponse;你应该在拦截注入$q服务,做return $q.reject(errorResponse);

2

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

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

来自克卢日的问候。

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