BACK
Use casesConditional retry — повторяем только временные ошибки
Use cases · 31

Conditional retry — повторяем только временные ошибки

Паттерн

Ошибка 500 или сетевая (status 0) — это часто временный сбой, имеет смысл повторить через секунду. Ошибка 400 (плохой запрос) или 401 (нет авторизации) — это сломанный payload или истёкший токен, повторять бессмысленно.

Какую проблему решаем

Простой retry(3) ретраит ВСЁ подряд, включая 400. Раздражаем backend ненужной нагрузкой, маскируем реальные баги в нашем коде. Нужна условная логика: что ретраить, что нет, с какой задержкой.

Операторы и зачем они нужны

  • retry({ count, delay }) — delay-callback получает ошибку и решает, стоит ли её ретраить.
  • timer(retryIndex * 10) — backoff: вторая попытка ждёт дольше первой.
  • throwError внутри delay-callback — останавливает retry для перманентных ошибок. Возвращаем error → retry превращается в реальный fail.
  • catchError — финальный сбой (после всех попыток) превращаем в UI state.

Подводные камни

  • retry без лимита (count) — бесконечная петля, если ошибка перманентная.
  • Без условия ретраите 400/401 — это бессмысленно и раздражает backend.
  • Не делайте retry для non-idempotent mutation (POST без idempotency key) — два списания, два сообщения, два бронирования.

Что в итоге получаем

Временный сбой восстанавливается прозрачно. Клиентская ошибка моментально превращается в понятный failure без серии бесполезных ретраев.

script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...