Angularjs 角度限制HTTP侦听器重试次数

Angularjs 角度限制HTTP侦听器重试次数,angularjs,angular-http-interceptors,Angularjs,Angular Http Interceptors,我编写了一个拦截器,当响应出错时,如果本地存储中存在状态代码和访问令牌,它将重试HTTP请求 我写这篇文章主要是为了对付我们正在使用的API(我无法控制)的神秘失败响应,因为在某些情况下重试就足够了。有时API端点会无缘无故地失败,因此我认为,由于我无法控制API的维护,因此我只需重试发送HTTP请求 primesis.factory('httpResponseErrorInterceptor', function ($q, $injector) { return { '

我编写了一个拦截器,当响应出错时,如果本地存储中存在状态代码和访问令牌,它将重试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
        }
    };
}); 
这通过在响应配置本身上附加计数器来实现


我承认这可能需要一些重构,但你明白了。这适用于我的用例,我认为这很容易修改。

这就是问题所在!我认为这项服务需要注入拦截器,对吗?我必须为计数器创建访问器和变异器吗?我很难想象如何将计数器与其各自的请求相关联。是的,您必须将服务注入拦截器,是的,您应该为计数器创建访问器和变异器。问题在于如何跟踪请求及其计数器。一种可能是对URL和参数进行散列,但这将导致类似的请求也具有相同的计数器。我建议您生成一个uuid,在其中发出请求并使用相同的uuid进行重试。一旦请求成功,你应该清除计数器。现在我开始更清楚了,但是我如何区分重试的请求和新的请求呢?(因为我会为新的UUID创建一个UUID,并为重试但仍然失败的UUID添加到计数器。)