如果 HTTP 错误代码为 500,Angular 会重新尝试 API 请求

Abh*_*ava 0 httpclient rxjs angular

我正在尝试向我的 API 调用添加一个简单的 HTTP 重新尝试,如下所示

this.http.post(url, {payload})
    .pipe(retry(3)).sub.....
Run Code Online (Sandbox Code Playgroud)

如何添加以下案例?

  1. 仅重试 3 次
  2. 间隔1秒
  3. 仅当HTTP错误码为500时

nir*_*aft 5

您可以使用retryWhenRxJS 重试任何请求。下面是在抛出错误之前尝试 3 次的代码片段:

private handleRetry<T>(source: Observable<T>): Observable<T> {
        return source.pipe(retryWhen(e => e.pipe(scan((errorCount, error) => {
            if (errorCount >= 3) {
                throw error;
            }
            return errorCount + 1;
        }, 0),
            delay(1000)
        )));
    }
Run Code Online (Sandbox Code Playgroud)

在组件调用中您可以使用handleRetry :

this.http.post(url, {payload})
    .pipe(this.handleRetry).sub.....
Run Code Online (Sandbox Code Playgroud)

您还可以tap进入错误以根据状态代码决定是否需要重试:例如:

server.getData().pipe(
  retryWhen(errors =>
    errors.pipe(
      delay(1000),
      tap(errorStatus => {
        if (!errorStatus.startsWith('5')) {
          throw errorStatus;
        }

        console.log('Retrying...');
      })
    )
  )
);
Run Code Online (Sandbox Code Playgroud)