Вы можете использовать retryWhen
из RxJS, чтобы повторить любые запросы.ниже приведен фрагмент кода, который повторяется 3 раза перед выдачей ошибки:
private handleRetry<T>(source: Observable<T>): Observable<T> {
return source.pipe(retryWhen(e => e.pipe(scan((errorCount, error) => {
if (errorCount >= 3) {
throw error;
}
return errorCount + 1;
}, 0),
delay(1000)
)));
}
при вызове компонента вы можете использовать handleRetry
:
this.http.post(url, {payload})
.pipe(this.handleRetry).sub.....
Вы также можете tap
в ошибку, чтобы решить, нужно ли вам повторить попытку на основе кода состояния: Пример:
server.getData().pipe(
retryWhen(errors =>
errors.pipe(
delay(1000),
tap(errorStatus => {
if (!errorStatus.startsWith('5')) {
throw errorStatus;
}
console.log('Retrying...');
})
)
)
);