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))
);
}
我正在使用 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))
);
}