Use cases/Stale 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 не различает источник.