Уроки54. Project: cache request with shareReplay
Уроки · 54
54. Project: cache request with shareReplay
Проект 6 — кэш в Angular-сервисе
Типичная ситуация в Angular: сервис UserService отдаёт profile$. Этот поток подписывают и navbar, и user-menu, и settings-page. Без кэша — три HTTP-запроса за тем же профилем.
Решение в одну строку
profile$ = this.http.get('/api/profile').pipe(
shareReplay({ bufferSize: 1, refCount: false })
);
Что значат опции
bufferSize: 1— храним один последний результат.refCount: false— кэш не сбрасывается, даже если все отписались. Подходит для долгоживущих сервисов.
Что нужно сделать
- В
createCachedProfile$внутриpipeдобавьтеshareReplay({ bufferSize: 1, refCount: false }). - Тест убедится, что счётчик
requestsравен 1 несмотря на двух подписчиков (второй приходит через 80мс — уже после завершения запроса).
Детерминированная проверка
В этой задаче проверка идет через виртуальное время TestScheduler. Если решение верное, в консоли появится только Test Passed!. Не добавляйте лишние console.log, иначе проверка провалится.
Решение spoiler · click to reveal
const { defer, shareReplay } = Rx;
function createCachedProfile$(request$) {
return request$.pipe(
shareReplay({ bufferSize: 1, refCount: false })
);
} script.ts
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...