BACK
Уроки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.

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

  1. В pipe cold$ добавьте share().
  2. Проверка убедится, что счётчик стартов 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 // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...