Когда следует использовать '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, чтобы узнать, почему они не совпадают.