BACK
Уроки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}).

Что нужно сделать

  1. В pipe добавьте retry(2).
  2. Источник падает первые две попытки, на третьей даёт Success.
  3. Ожидаемый вывод: 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 // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...