Чем отличаются холодные и горячие 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повторная подписка в шаблоне черезasyncpipe приведёт к дублированию запросов. shareReplayдержит подписку на источник — приrefCount: falseона не закрывается; для долгоживущих потоков это источник утечек.
Коротко для собеседования
Холодный создаёт источник на каждую подписку (HTTP-запросы), горячий делит один источник между подписчиками (события, Subject). Холодный делают горячим через share и shareReplay.