RxJS завершает работу оператора с shareReplay, вызываемым для каждого подписчика - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть следующий код:

const source = interval(1000).pipe(
  take(3),
  finalize(() => console.log('complete')),
  shareReplay({ bufferSize: 1, refCount: true}),
);

source.subscribe(x => console.log(x));
source.subscribe(x => console.log(x));
source.subscribe(x => console.log(x));

Теперь полный журнал вызывается один раз. Когда я перемещаю оператор finalize, чтобы он был после shareReplay, он вызывался три раза, что, я полагаю, приходится на каждого подписчика, но почему он так работает?

   const source = interval(1000).pipe(
      take(3),
      shareReplay({ bufferSize: 1, refCount: true}),
      finalize(() => console.log('complete')),
    );

Оператор finalize подписался на внутренний ReplaySubject, который завершается один раз, нет?

1 Ответ

0 голосов
/ 05 апреля 2019

Завершить Оператор испускает, когда его исходная наблюдаемая завершена.

Оператор ShareReplay создает новые наблюдаемые для каждого подписчика и воспроизводит исходные наблюдаемые значения.

Оператор Take завершается толькопосле окончания для выдачи заданного количества раз выполнения.

Итак, в вашем первом случае, Take (3) наблюдаемый будет излучать 3 раза, затем его наблюдаемый будет завершен и финализирован вызывается один раз.

Во втором случае ReplayShare создаст новых наблюдаемых для каждого подписчика (по всем 3 подпискам), а финализированная будет вызываться 3 раза, один раз для каждой созданной наблюдаемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...