1

我编写了一个拦截器,当响应错误时,如果本地存储中存在状态代码和访问令牌,则重试 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 中确实存在错误的情况下,这会导致拦截器无限重试。

我想要实现的是限制此拦截器的重试次数。我试过在里面放一个计数器,但似乎计数器没有继续下一个拦截器调用。

我一直在寻找可以解决这种情况但无济于事的东西。有没有办法限制拦截器响应错误重试?

4

2 回答 2

2

@csupnig's answer如果你能想象它并为它编写一个实现,它会起作用,但我设法在同一个拦截器本身的范围内做到这一点:没有添加服务。

我是这样做的:

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
        }
    };
}); 

这通过在响应配置​​本身上附加计数器来工作。

我承认这可以使用一些重构,但你明白了。这适用于我的用例,我认为这很容易改变。

于 2015-11-13T08:41:23.440 回答
0

计数器是正确的解决方案,但您必须将其放入服务中才能使其在下一个拦截器调用中存活。

我将构建一个管理请求和重试映射的服务。

于 2015-11-12T09:18:47.917 回答