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

Roy*_*mir 25 javascript rxjs angular

我已经知道了

  • 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
Run Code Online (Sandbox Code Playgroud)

如果我不想要多个http请求,我可以使用:

publishReplay().Connect()

但我也可以使用:shareReplay(),但我确信这里有一个比另一个更正确.

题 :

我何时应该使用 publishReplayvs shareReplay ?Http目前和未来的要求会有什么不同?

NB为什么没有关于的文档shareReplay

Dev*_*Rok 28

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

当然不.

两者shareReplaypublishReplay(+呼唤connect它)都会让它背后的观察变得热烈.

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

  • shareReplay:不管是否没有订阅,都不会停止发放直到它完成.
  • publishReplay:在最后一个订阅者取消订阅后停止,如果与之一起使用refCount

Imho这是一个至关重要的信息.

  • [功能](https://github.com/ReactiveX/rxjs/blob/master/CHANGELOG.md#features)已发布6.4.0 :) (5认同)
  • 是的,非常关键!另请注意,一项新功能(配置选项)将使事情进一步复杂化/简化(特别是关于“ shareReplay”的退订行为):https://github.com/ReactiveX/rxjs/issues/3336-已在https://中修复github.com/ReactiveX/rxjs/pull/4059 (2认同)
  • 关于6.4.0中新配置对象的文章:https://medium.com/@cartant/rxjs-whats-changed-with-sharereplay-65c098843e95 (2认同)

Joe*_*ing 14

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

通常,如果将observable用于模板(html文件)中使用shareReplay.优点是您不必担心取消订阅等.

  • @RoyiNamir `refCount()` 控制 `ConnectableObservable` 何时连接到其源 Observable。它与 `shareReplay` 中的缓冲区无关。换句话说,即使 `publishReplay` 从其父节点取消订阅,缓冲区仍然存在,并且无论 `publishReplay` 是否订阅其源,它都会发送给每个新的观察者。 (3认同)
  • 如果是这样,那么我不明白为什么 refcount 是“0”,但它仍然为将来的订阅发出一个值,是因为重播吗?http://jsbin.com/nirisugudi/edit?html,js,console (2认同)
  • 另外,关于您的评论和问题中的模板,`|async` 不是也会自动取消订阅吗? (2认同)

nyx*_*yxz 5

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

这是一篇很棒的文章,详细解释了这一点:“Angular Async Pipes?-注意共享”

编辑:

正确的说法是:

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

有关为什么它们不完全相同的更多信息,请参阅@DevRok 的答案