BACK
Уроки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 — кэш не сбрасывается, даже если все отписались. Подходит для долгоживущих сервисов.

Что нужно сделать

  1. В createCachedProfile$ внутри pipe добавьте shareReplay({ bufferSize: 1, refCount: false }).
  2. Тест убедится, что счётчик 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 // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...