首页 > 解决方案 > 有没有办法通过使用 rxjs 运算符重试来获取角度的 HTTP 状态代码?

问题描述

getRequest(url : string,retryCount = 2) {
    return new Observable(response => {
     return this.http.get<any>(url)
     .pipe(
        retryWhen((error) => {
          return error.pipe(
            concatMap((e, i) => {
              if (i >= retryCount) {
                return throwError({ ...e, retryCount });
              }
              return of(e).pipe(delay(2000));
            })
          );
        })
      )
      .subscribe(data => {
        response.next(data);
        }, (err: HttpErrorResponse) => {
              response.next() //expected 404 ,500 and so on
          });
      });
  }

getRequest(https://jsonplaceholder.typicode.com/postss).subscribe((data: any) => {
      console.log(data);
      }); 

上面的代码必须在错误时返回错误代码。上面的 url 不存在,必须在 2 次重试时获得 404。需要进行哪些更改才能获得这些错误代码?

标签: angularhttprxjsobservable

解决方案


您可以像这样在 retryWhen 运算符中检索状态代码:

getRequest(url: string, retryCount = 2) {
  return this.http.get(url).pipe(
    retryWhen(errors => errors.pipe(
      mergeMap((error, i) => i < retryCount ? timer(2000) : throwError(error)
      )
    ))
  );
}

getRequest('api').subscribe(
  () => { }, // success
  error => console.log(error.status)
);

在上面的代码中,在retryWhen运算符中,我们捕获了错误,并像您正在做的那样以 2 秒的延迟重试请求 2 次。

然后,我们抛出错误并在订阅调用的错误函数中处理它。

我们可以通过status从传入的错误中检索属性来获取状态。

我希望我回答了你的问题:)


推荐阅读