PassFront
  1. PassFront
  2. База знаний
  3. Signals и RxJS

Чем отличаются холодные и горячие Observable?

Signals и RxJS

Холодный (cold) Observable запускает источник заново для каждого подписчика, а горячий (hot) использует один общий источник, и подписчики получают то, что происходит с момента подписки.

Холодный

Данные создаются внутри Observable при подписке. У каждого подписчика — своё выполнение:

const cold$ = new Observable<number>((sub) => {
  console.log('источник запущен');
  sub.next(Math.random());
});
cold$.subscribe(console.log); // своё значение
cold$.subscribe(console.log); // другое значение, источник запущен снова

Типичные примеры: of, from, interval, HttpClient.get() — два подписчика сделают два HTTP-запроса.

Горячий

Источник существует независимо от подписчиков: DOM-события, WebSocket, Subject. Опоздавший подписчик пропускает уже прошедшие значения.

Как превратить холодный в горячий

  • share() — один общий запрос на всех подписчиков, пока есть хотя бы один.
  • shareReplay(1) — то же, но новые подписчики получают последнее значение; часто используют для кэша HTTP-ответа.
  • Передать данные через Subject.
user$ = this.http.get<User>('/api/me').pipe(shareReplay(1));

Нюансы

  • Без share повторная подписка в шаблоне через async pipe приведёт к дублированию запросов.
  • shareReplay держит подписку на источник — при refCount: false она не закрывается; для долгоживущих потоков это источник утечек.

Коротко для собеседования

Холодный создаёт источник на каждую подписку (HTTP-запросы), горячий делит один источник между подписчиками (события, Subject). Холодный делают горячим через share и shareReplay.

Другие вопросы раздела