Когда следует использовать 'publishReplay' vs 'shareReplay'?

я уже знаю, что

  • publish акции одной подпиской, а также возвращает ConnectableObservable (поэтому нам нужно Connect())

  • Share() is publish().refcount()

Replay довольно очевиден, он возвращает свои последние выбросы/с.

Возьмем, например, Angular http-запрос с настоящей И будущей подпиской:

<p>{{ (person | async)?.id   }}</p> //present markup

<p *ngIf="show">{{ (person | async)?.userId }}</p> //future markup

Если я не хочу использовать несколько http запросов, я могу использовать:

publishReplay().Connect()

Но я также могу использовать: shareReplay(), но я уверен, что здесь есть один, который правильнее использовать, чем другой.

Вопрос:

Когда следует использовать publishReplay vs shareReplay? Какая разница в терминах настоящего и будущего запроса Http?

NB Почему там нет документации о shareReplay?

Ответ 1

publishReplay позволяет вам контролировать, когда начинается подписка. shareReplay начнется автоматически после первой подписки.

В общем случае, если наблюдаемый должен использоваться в шаблоне (html файл), используйте shareReplay. Преимущество в том, что вам не придется беспокоиться о том, чтобы отказаться от подписки и т.д.

Ответ 2

shareReplay() - это в основном publishReplay(). refCount()

Точно нет.

И shareReplay и publishReplay (+ вызывая connect на нем) сделают наблюдаемое за ним горячим.

Но очень важное различие между ними:

  • shareReplay: не прекращает излучать, пока не завершится, независимо от того, подписок больше нет или нет.
  • publishReplay: остановится после того, как последний подписчик refCount если используется вместе с refCount

Имхо это важная информация.

Ответ 3

shareReplay() - это в основном publishReplay().refCount()

Вот отличная статья, в которой подробно объясняется: "Угловые асинхронные трубы - остерегайтесь доли"

Редактировать:

Правильно сказать следующее:

shareReplay() похож на publishReplay().refCount()

см. @DevRok answer, чтобы узнать, почему они не совпадают.