Уроки36. retry: повторить источник после ошибки
Уроки · 36
36. retry: повторить источник после ошибки
retry — повторить при ошибке
Сеть капризна: иногда запрос падает «случайно». retry(N) говорит RxJS: «если поток упал, попробуй ещё N раз». N — это количество дополнительных попыток, не считая первой.
source$.pipe(retry(2))
// Попытка 1: error → попытка 2: error → попытка 3: success → пропускаем дальше
// Если все три провалились — error уходит подписчику
Как retry это делает
При ошибке retry просто заново подписывается на исходный Observable. Это значит, что вся работа источника запустится снова — включая HTTP-запрос, побочные эффекты и логи.
Когда не стоит
Не повторяйте автоматически операции, у которых нет смысла без подтверждения пользователя (например, платёж). И не используйте retry для постоянных ошибок (404, 401) — только зря тратите ресурсы. Для умного retry с задержкой и условием есть retry({delay, count}).
Что нужно сделать
- В
pipeдобавьтеretry(2). - Источник падает первые две попытки, на третьей даёт
Success. - Ожидаемый вывод:
Attempt: 1 → Attempt: 2 → Attempt: 3 → Success.
Решение spoiler · click to reveal
const { Observable, retry } = Rx;
let attempts = 0;
const source$ = new Observable(subscriber => {
attempts++;
console.log('Attempt: ' + attempts);
if (attempts <= 2) {
subscriber.error('Temporary error');
return;
}
subscriber.next('Success');
subscriber.complete();
});
const result$ = source$.pipe(
retry(2)
);
result$.subscribe({
next: value => console.log(value),
error: error => console.log('Final Error: ' + error),
}); script.ts
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...