我们可以使用RxJS的retryWhen操作符在ngrx effect中实现根据条件进行重试。
首先在我们的effect中定义一个Observable,当满足条件时该Observable会返回true。在调用http请求之前,我们可以使用RxJS的takeWhile操作符过滤掉Observable中不满足条件的值。如果takeWhile返回false,我们会在retryWhen中尝试重试 effect。
下面是实现过程的代码示例:
import { Injectable } from '@angular/core';
import { Actions, createEffect, ofType } from '@ngrx/effects';
import { catchError, map, mergeMap, retryWhen, takeWhile } from 'rxjs/operators';
import { of, timer } from 'rxjs';
@Injectable()
export class MyEffect {
loadMyData$ = createEffect(() =>
this.actions$.pipe(
ofType('[MyComponent] Load My Data'),
mergeMap(() =>
this.myService.getData().pipe(
takeWhile(result => !result.finished), // condition for retrying
map(response => ({ type: '[MyComponent] Load My Data Success', payload: response })),
catchError(error => of({ type: '[MyComponent] Load My Data Failure', error }))
)
),
retryWhen(errors =>
errors.pipe(
mergeMap(error => {
if (error.status === 404) { // If error status is 404, retry after 5 seconds
return timer(5000);
} else if (error.status === 500) { // If error status is 500, retry after 10 seconds
return timer(10000);
} else {
return of(error); // Throw the error
}
})
)
)
)
);
constructor(
private actions$: Actions,
private myService: MyService
) {}
}
在此示例中,我们定义了一个条件为“! result.finished”的takeWhile操作符,以确保在满足此条件之前不会重试 effect。在retryWhen操作符中,我们为两种HTTP错误状态码(404和500)设置了不同的重试时间。
这个解决方