什么时候应该使用`publishReplay` vs`ShareReplay`?

时间:2017-12-21 13:42:24

标签: javascript angular rxjs

我已经知道了

  • publish共享一个订阅,并返回ConnectableObservable(因此我们必须Connect()

  • Share()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的文档?

3 个答案:

答案 0 :(得分:10)

  

shareReplay()基本上是publishReplay()。refCount()

绝对不是。

shareReplaypublishReplay(在其上调用connect)都会使后面的可观察对象变热。

但是它们之间的非常重要的区别是

  • shareReplay完成之前不会停止发送,无论是否不再有订阅。
  • publishReplay:如果最后一个订阅者与refCount一起使用,则将终止

这是至关重要的信息。

答案 1 :(得分:9)

publishReplay允许您控制订阅何时开始。 shareReplay将在第一次订阅时自动启动。

通常,如果要在模板(html文件)中使用observable,请使用shareReplay。您赢得的优势是不必担心取消订阅等。

答案 2 :(得分:2)

shareReplay()基本上是publishReplay().refCount()

这是一篇很棒的文章,详细解释了:"Angular Async Pipes  - Beware the share"

编辑:

正确的话是:

shareReplay() 类似于publishReplay().refCount()

有关更多信息,请参见@DevRok's answer,为什么它们并不完全相同。