Уроки41. share: один источник для нескольких подписчиков
Уроки · 41
41. share: один источник для нескольких подписчиков
Cold vs Hot — важная пара понятий
Cold Observable запускает свою логику заново для каждого подписчика. of, from, defer, HTTP-запрос — всё cold. Подписались дважды — запросов будет два.
Hot Observable — один источник на всех. Все подписчики видят одни и те же значения. Subject — типичный пример.
share — простой multicast
share() превращает cold Observable в hot, пока есть хотя бы один подписчик. Внутри он использует Subject, но избавляет вас от ручной работы.
cold$.pipe(share())
// двое подписались → один cold-запуск → оба получают одни и те же значения
Глоссарий
- Multicast — рассылка одного потока многим подписчикам.
- Unicast — отдельный поток на каждого подписчика. Cold = unicast.
Что нужно сделать
- В pipe
cold$добавьтеshare(). - Проверка убедится, что счётчик стартов
startsравен 1 — то есть cold-источник запустился только один раз, несмотря на двух подписчиков.
Детерминированная проверка
В этой задаче проверка идет через виртуальное время TestScheduler. Если решение верное, в консоли появится только Test Passed!. Не добавляйте лишние console.log, иначе проверка провалится.
Решение spoiler · click to reveal
const { Observable, share } = Rx;
let starts = 0;
const cold$ = new Observable(subscriber => {
starts += 1;
const subscription = cold('20ms a|', { a: 'value' }).subscribe(subscriber);
return () => subscription.unsubscribe();
});
const shared$ = cold$.pipe(
share()
); script.ts
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...