我正在尝试使用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 :(得分:2)
首先,这不是拦截器执行UI操作的工作。应该有一个AuthService / Provider / Controller,您应该在其中发送拦截器捕获的数据,并根据该数据,在那里采取必要的操作。您可以使用事件系统或调用服务中的方法。
这可能无法解决您的问题,但它将解决您未来的挑战。
来自克卢日的问候。
答案 1 :(得分:0)
我认为问题是,你可能已经处于状态转换状态,但错误拦截器启动后再尝试进行另一次转换。
我总是明确拒绝错误拦截器捕获的当前解析的承诺:
而不是$q
你应该在拦截器中注入return $q.reject(errorResponse);
服务并执行{{1}}
答案 2 :(得分:0)
$rootScope.$on('$stateChangeError',
function(event, toState, toParams, fromState, fromParams, error) {
console.log(event, toState, fromState, error);
if (something) {
$state.go('error', toParams, {
reload: false
});
}
});