【问题标题】:How to handle multiple error code scenario in http request如何处理http请求中的多个错误代码场景
【发布时间】:2017-12-30 06:53:06
【问题描述】:

以下错误代码:-

400 - 执行 single 响应到达时重试 without delay

502、503 和 504 执行 eight 重试次数 1000 Sec delay

我的代码如下:-

private _getData('loginKey', body, headers) {
return this._http.post('url', body, { headers: headers })
  .map((response: Response) => response.json())
  .retryWhen(errors => {
    return errors
      .mergeMap((error) => this.handleError(error))
      .delay(2000)
      .take(8);
  });
}

public handleError(error: Response | any): Observable<any> {
  if (error.status === 400) { // retry 1 time and with no delay
    return Observable.of(error);
  } else { // retry confgured times and configured delay
    return Observable.of(error);
  }
}

我的问题是如何根据上面的错误代码更改delaytake的值:

如果error.status400 那么delay value 0take value 1

如果error.status502、503 和504,那么delay value 2000take value 8

【问题讨论】:

  • 如果我的回答回答了你的问题,你会接受吗?
  • 是的,如果有帮助的话。
  • 我已经更新了答案

标签: angular http error-handling observable


【解决方案1】:

最简单的方法是在服务中定义一个函数,该函数将返回您想要的值。

示例:

let errorStatus;
private _getData('loginKey', body, headers) {
return this._http.post('url', body, { headers: headers })
  .map((response: Response) => response.json())
  .retryWhen(errors => {
    return errors
      .mergeMap((error) => {
          errorStatus = error.status;
          this.handleError(error))
      })
      .delay(ResponseService.getDelay(errorStatus))
      .take(ResponseService.getRetries(errorStatus));
  });
}

在 ResponseService.js 中...

function getDelay(status) {
    let val = 0;
    switch(status) {
        case 400:
            val = 0;
            break;
        ...
    }
    return val;
}

function getRetries(status) {
    let val = 0;
    switch(status) {
        case 400:
            val = 1;
            break;
        ...
    }
    return val
}

【讨论】:

  • error.statusdelaytake 中无法访问,不知道如何访问它。
  • 我更新了作品。您应该能够捕获错误的值,以便您可以在 mergeMap 范围之外使用它
  • 我已经尝试了您的解决方案,但仍然无法在 delaytake 中访问 errorstatus,因为这是在 mergeMap 内部代码运行之前调用的。因此,此代码的任何解决方案或任何可用的替代解决方案。 请查看此链接: reactivex.io/rxjs/class/es6/Observable.js~Observable.html 我不完全了解 Observable uses 我已使用此链接中的一种方法 mergeMapdelaytake 所以也许有任何替代此链接上提供了解决方案。如果你知道的话,请指导我使用什么方法来解决这个问题。
猜你喜欢
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
相关资源
最近更新 更多