Use cases/Conditional 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 без серии бесполезных ретраев.