Javascript 在$http响应拦截器中使用$state.go
当使用http拦截器接收到禁止的或未经授权的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
错误:转换被取代
这是我的响应错误拦截器:
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
});
}
});