Angular - 限制 HTTP 拦截器重试
Angular - Limit HTTP interceptor retries
我编写了一个拦截器,如果响应错误,如果本地存储中存在状态代码和访问令牌,则会重试 HTTP 请求。
我写这篇文章主要是为了应对我们正在使用的 API 的神秘失败响应(我无法控制),因为在某些情况下重试就足够了。有时 API 端点会无缘无故地失败,所以我认为由于我无法控制 API 的维护,所以我只是重试发送 HTTP 请求。
primesis.factory('httpResponseErrorInterceptor', function ($q, $injector) {
return {
'responseError': function (response) {
if(response.status === 500 && localStorage.getItem('token')) {
var $http = $injector.get('$http');
return $http(response.config);
}
return $q.reject(response);
}
};
});
$httpProvider.interceptors.push('httpResponseErrorInterceptor');
但是,在 API 中确实存在错误的情况下,这会导致无限重试拦截器。
我想要实现的是限制此拦截器的重试次数。我试过在其中放置一个计数器,但似乎计数器不会继续进行下一个拦截器调用。
我一直在寻找解决此类情况的方法,但无济于事。有没有办法限制拦截器响应错误重试?
计数器是正确的解决方案,但您必须将它放在服务中才能使其在下一次拦截器调用时继续存在。
我会构建一个管理请求和重试映射的服务。
@csupnig 的回答如果你能想象它并为它编写一个实现就可以了,但我设法在同一个拦截器本身的范围内做到这一点:没有添加服务。
我是这样做的:
app.factory('httpResponseErrorInterceptor', function ($q, $injector) {
return {
responseError: function (response) {
if(response.status === 500 && localStorage.getItem('token')) {
var $http = $injector.get('$http');
if(response.config.Retries===undefined){
//do something on first error e.g, reporting
response.config.Retries=1;
return $http(response.config);
}else{
if(response.config.Retries!==2){
response.config.Retries = response.config.Retries +1;
return $http(response.config);
}
else{
response.config.Retries = undefined;
//do something on last retry
return $q.reject(response);
}
}
}
return $q.reject(response); // give up
}
};
});
这通过在响应配置本身上附加计数器来实现。
我承认这可能需要一些重构,但你明白了。这适用于我的用例,我认为这很容易改变。
我编写了一个拦截器,如果响应错误,如果本地存储中存在状态代码和访问令牌,则会重试 HTTP 请求。
我写这篇文章主要是为了应对我们正在使用的 API 的神秘失败响应(我无法控制),因为在某些情况下重试就足够了。有时 API 端点会无缘无故地失败,所以我认为由于我无法控制 API 的维护,所以我只是重试发送 HTTP 请求。
primesis.factory('httpResponseErrorInterceptor', function ($q, $injector) {
return {
'responseError': function (response) {
if(response.status === 500 && localStorage.getItem('token')) {
var $http = $injector.get('$http');
return $http(response.config);
}
return $q.reject(response);
}
};
});
$httpProvider.interceptors.push('httpResponseErrorInterceptor');
但是,在 API 中确实存在错误的情况下,这会导致无限重试拦截器。
我想要实现的是限制此拦截器的重试次数。我试过在其中放置一个计数器,但似乎计数器不会继续进行下一个拦截器调用。
我一直在寻找解决此类情况的方法,但无济于事。有没有办法限制拦截器响应错误重试?
计数器是正确的解决方案,但您必须将它放在服务中才能使其在下一次拦截器调用时继续存在。
我会构建一个管理请求和重试映射的服务。
@csupnig 的回答如果你能想象它并为它编写一个实现就可以了,但我设法在同一个拦截器本身的范围内做到这一点:没有添加服务。
我是这样做的:
app.factory('httpResponseErrorInterceptor', function ($q, $injector) {
return {
responseError: function (response) {
if(response.status === 500 && localStorage.getItem('token')) {
var $http = $injector.get('$http');
if(response.config.Retries===undefined){
//do something on first error e.g, reporting
response.config.Retries=1;
return $http(response.config);
}else{
if(response.config.Retries!==2){
response.config.Retries = response.config.Retries +1;
return $http(response.config);
}
else{
response.config.Retries = undefined;
//do something on last retry
return $q.reject(response);
}
}
}
return $q.reject(response); // give up
}
};
});
这通过在响应配置本身上附加计数器来实现。
我承认这可能需要一些重构,但你明白了。这适用于我的用例,我认为这很容易改变。