如何在http请求中处理多个错误代码场景

时间:2017-07-24 15:41:14

标签: angular http error-handling observable

以下错误代码: -

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.status 400 ,则delay value 0take value 1

如果error.status 502,503和504 ,则delay value 2000take value 8

1 个答案:

答案 0 :(得分: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
}