RxJS: 在 catchError 中过滤错误

RxJS: filtering errors in catchError

我正在使用 ngRx store 开发 Angular 前端。我有一个效果,可以从后端 API 获取订单。操作是 fetchOrders,如果获取成功,它将调度 ordersFetched。如果不成功,catchError 将在等待 10 秒后调度 fetchOrders 操作以重试获取。

@Effect()
fetchOrders$ = this.actions$.pipe(
  ofType(fetchOrders),
  switchMap(() => this.orderService.getOrders().pipe(
    map((orders) => {
      return ordersFetched({ orders });
    }),
    catchError((error) => timer(10000).pipe(
        tap(() => console.log(error)),
        tap(() => console.log('retry')),
        map(() => fetchOrders())
      )
    )
  )
  )
)

我只想在错误包含状态代码 591(我们自己的特殊错误状态代码,表示订单尚未准备好)时重试。仅在特定条件下捕获错误的正确 RxJs 方法是什么(在本例中为状态代码 591)?我认为应该在 timer 运算符之前的某处有一个 filter 运算符,但我对 RxJs 很陌生。如果状态代码不是 591,则应该是未处理的错误。

奖励:actions$ 是否可以使用 RxJs 运算符重试而不是再次调度相同的操作?

我在拦截器上这样做是这样的:

intercept(request: HttpRequest < any >, next: HttpHandler): Observable < any > {
     // Handle response
     return next.handle(request).pipe(
     map((event: HttpEvent<any>) => {
  if (event instanceof HttpResponse) {
    // do something with response
  }
  return event;
}),
retryWhen((error) =>
  error.pipe(
    concatMap((error, count) => {
      if (error.status === 591) {
        if (count <= retryCount && request.method == 'GET') { return of(error); }

        // do something with Err
        return throwError(error);
      }
      return throwError(error);
    }),
    delay(retryWaitMilliSeconds)
  )),
catchError((error) => this._handleOtherStatusError(error, request, next))
);
}