BACK
Use casesStale while revalidate — кеш сразу, сеть потом
Use cases · 27

Stale while revalidate — кеш сразу, сеть потом

Паттерн

У нас в кеше есть прошлый ответ. Покажем его моментально, чтобы экран не был пустым, а параллельно пойдём в сеть за свежими данными. Когда сеть ответит — обновим UI.

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

Пользователь не должен ждать пустой экран, если у нас уже есть «достаточно хорошие» данные. Императивный код смешивает синхронное чтение кеша, асинхронный запрос и запись в кеш в одну плохо тестируемую кашу.

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

  • concat — гарантирует порядок: сначала кеш, потом сеть. Никаких гонок.
  • of(cache) — отдаёт закешированное значение как Observable, чтобы его можно было сцепить с сетевым.
  • defer — откладывает чтение/запись кеша до момента subscribe.
  • tap — пишет свежий ответ в кеш как side effect.
  • map — маркирует источник ('cache:...' или 'network:...') для UI.

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

  • merge вместо concat — сеть может ответить раньше эмита кеша, и пользователь увидит «мигание» с свежим → старым → свежим.
  • Пишите в кеш ТОЛЬКО после успешного ответа. Иначе stale value станет ошибочным после следующей перезагрузки.
  • Для long-lived источников (interval, WebSocket) concat без take повиснет — он ждёт complete от первого источника.

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

UI мгновенно показывает stale-данные, а затем плавно обновляется свежими. Контракт данных один и тот же — UI не различает источник.

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