我正在用ngRx商店开发一个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,那么它应该是未处理的错误。
额外的好处:是否可以使用RxJs操作员重试actions$
,而不仅仅是再次调度相同的操作?
我在Interceptor上这样做了:
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))
);
}