Angularjs 角度限制HTTP侦听器重试次数
我编写了一个拦截器,当响应出错时,如果本地存储中存在状态代码和访问令牌,它将重试HTTP请求 我写这篇文章主要是为了对付我们正在使用的API(我无法控制)的神秘失败响应,因为在某些情况下重试就足够了。有时API端点会无缘无故地失败,因此我认为,由于我无法控制API的维护,因此我只需重试发送HTTP请求Angularjs 角度限制HTTP侦听器重试次数,angularjs,angular-http-interceptors,Angularjs,Angular Http Interceptors,我编写了一个拦截器,当响应出错时,如果本地存储中存在状态代码和访问令牌,它将重试HTTP请求 我写这篇文章主要是为了对付我们正在使用的API(我无法控制)的神秘失败响应,因为在某些情况下重试就足够了。有时API端点会无缘无故地失败,因此我认为,由于我无法控制API的维护,因此我只需重试发送HTTP请求 primesis.factory('httpResponseErrorInterceptor', function ($q, $injector) { return { '
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
}
};
});
这通过在响应配置本身上附加计数器来实现
我承认这可能需要一些重构,但你明白了。这适用于我的用例,我认为这很容易修改。这就是问题所在!我认为这项服务需要注入拦截器,对吗?我必须为计数器创建访问器和变异器吗?我很难想象如何将计数器与其各自的请求相关联。是的,您必须将服务注入拦截器,是的,您应该为计数器创建访问器和变异器。问题在于如何跟踪请求及其计数器。一种可能是对URL和参数进行散列,但这将导致类似的请求也具有相同的计数器。我建议您生成一个uuid,在其中发出请求并使用相同的uuid进行重试。一旦请求成功,你应该清除计数器。现在我开始更清楚了,但是我如何区分重试的请求和新的请求呢?(因为我会为新的UUID创建一个UUID,并为重试但仍然失败的UUID添加到计数器。)