我的angularjs应用程序中有一个$http
。
如果我的api返回未经授权的响应,我会显示登录名。
一旦用户通过模态登录,请求拦截器就会重试$http
请求。
app.factory('LoginInterceptor', function ($injector, $timeout, $q) {
return {
request: function (config) {
return config;
},
response: function (response) {
var LoginModalService = $injector.get('LoginModalService'),
$http = $injector.get('$http'),
$location = $injector.get('$location'),
$rootScope = $injector.get('$rootScope'),
url = response.config.url.split('?')[0];
if (response.data && response.data.token_status <= 0) {
return $timeout(angular.noop, 1000).then(function () {
return LoginModalService.show();
}).then(function () {
return $http(response.config);
}, function () {
$location.path('/login');
return $q.reject(response);
});
}
return response || $q.when(response);
}
}
});
问题是,如果多个请求异步触发,则会显示每个请求的登录名。
如何在用户登录之前停止执行所有其他请求?目前,当发出一个请求时,这种方法就可以工作。我不想取消所有其他请求,我希望在用户登录后解决这些请求。
您可以在返回的第一个未授权请求上设置一个标志,并拒绝以下所有未授权请求/响应:
app.factory('LoginInterceptor', function ($injector, $timeout, $q) {
var isAuthorized = true;
return {
request: function (config) {
if(isAuthorized){
return config
}else{
return $q.reject(config);
}
},
response: function (response) {
var LoginModalService = $injector.get('LoginModalService'),
$http = $injector.get('$http'),
$location = $injector.get('$location'),
$rootScope = $injector.get('$rootScope'),
url = response.config.url.split('?')[0];
if (response.data && response.data.token_status <= 0) {
if(isAuthorized){
isAuthorized = false;
return $timeout(angular.noop, 1000).then(function () {
return LoginModalService.show();
}).then(
return $http(response.config);
}, function () {
$location.path('/login');
return $q.reject(response);
});
}else{
return $q.reject(response)
}
}
return response || $q.when(response);
}
}
});