【问题标题】:Http Request retry mechanism in Angular 4?Angular 4中的Http请求重试机制?
【发布时间】:2017-11-22 22:27:24
【问题描述】:

我正在尝试在 Angular4 中实现请求/响应拦截机制。我对可观察对象相当陌生。

我维护了两个拦截器数组,一个用于请求,另一个用于响应。拦截器只不过是接受请求/响应对象并对其进行转换的函数。

sendRequest(req:Response):Observable<Response>{
    req= this.processRequest(req);

    This.http.request(req)
           .map( (res:Response)=>{
                return this.processResponse(res)
            })
            .catch(this.handleError)
}

handleError(err:Response):Observable<Response>{
    return Observable.throw(err);
}

基本错误处理工作正常。有时对于 401 异常,我想获取新的 Auth 令牌并使用更新的 Auth 令牌重试相同的请求。

我在想的是引入错误拦截器数组。其中一个错误拦截器函数将检查它是否为 401,并向服务器发出新的刷新请求,使后续的错误拦截器函数无效。我认为需要切换可观察流。观察者最终会得到最新请求的响应。如何进行此操作?

【问题讨论】:

标签: angular typescript rxjs


【解决方案1】:

试试这个:

this.http.get('some/url').retry(2)......

【讨论】:

    【解决方案2】:

    在与http.request 相同的级别上执行此操作对我来说似乎更容易,因为否则您将需要跟踪所有信息以重新发出请求,但在这种情况下这可能没有问题......

    我猜你的拦截器正在对请求对象本身进行操作并返回请求对象的副本?例如,类似...

    transformResponse(response) {
      for(let interceptor of interceptors) {
        response = interceptor(response);
      }
      return response;
    }
    

    拦截器的原型如下:

    interface Interceptor<T> {
      (rsp: T): V;
    }
    

    你能不能把拦截器原型改成类似的东西

    interface Interceptor<T> {
      (rsp: T): T | Promise<T> | Observable<T>;
    }
    

    那你可以做...

    transformResponse(responseObs: Observable<any>) {
      for(let interceptor of interceptors) {
        responseObs = responseObs.flatMap(interceptor);
      }
      return responseObs;
    }
    

    这将允许拦截器返回响应的异步转换(例如重新发出请求)。

    【讨论】:

      猜你喜欢
      • 2018-03-30
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      相关资源
      最近更新 更多