RxJS5 中 shareReplay(1) 的模式

Pattern for shareReplay(1) in RxJS5

我已经开始玩 RxJS5,现在发现不再有 shareReplay 方法。

很有可能我在 RxJS4 中经常误用 shareReplay,但现在我正在努力获得我想要的行为,即:

如何使用 RxJS5 实现它?

总的来说,我认为我对 RxJS 的操作符理解得很好,但是整个冷、热、发布、连接对我来说还是不太清楚。是否有一个很好的参考来说明如何找到我拥有的哪种可观察对象,以便我可以以合乎逻辑的方式找出为什么订阅没有获取值,或者为什么一个可观察对象被多次执行?

编辑

好消息,shareReplay() 又回到了 RxJS 5.4.0 中:

变更日志:https://github.com/ReactiveX/rxjs/blob/892700dd4f5d5e5f9ae9276ede32208f4390c5e9/CHANGELOG.md#540-2017-05-09

准系统文档:http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-shareReplay

这个问题最好由参与 Rxjs5 的成员回答,但这是我的看法:

  • shareReplay 是带有 ReplaySubjectmulticast 运算符,后跟 refCount。所以我敢打赌 publishReplay(x).refCount() 应该非常接近 shareReplay 行为。无论如何,publishReplay 已经为您提供了您提到的所有要点。 refCount 在没有更多观察者时添加取消订阅(refCount 减少为 0)。
  • 您可以在此处查看规格 http://reactivex.io/rxjs/test-file/spec-js/operators/publishReplay-spec.js.html。请参阅第 127 行 var replayed = source.publishReplay(1).refCount();,这应该等同于您的 shareReplay(1).

关于你的问题的其余部分:

  • 我想我们都想要 good reference that shows how to find what kind of observable I have...。有很多地方,包括 Rxjs4 文档,您可以在其中找到有关热和冷可观察量的解释。
  • Here, and here 是一些资源示例。

以下是我目前对此事的理解:

  • 对象很热(无论如何,你可能会争辩说重放对象的行为比冷观察对象更接近)
  • 除非另有明确说明,否则所有 observables 都是冷的。
  • 在使冷的可观察对象变热的显式方法中,您有 multicast 运算符及其派生词 sharepublishshareReplay 等。这些运算符在内部都涉及科目。
  • 请注意,您不必看到使用了这些运算符。但在那种情况下,API 或文档应该明确告诉您。例如,Rx.Observable.fromEvent('input','click') 很热。你可以在它的实现中看到某处有一个share
  • 到 hot/cold 二分法你必须添加 connectable 类型,直到它连接起来,它既不热也不冷。
  • defer 总是会产生一个冷的 observable。
  • 最后,一些操作符不会改变可观察对象的性质,但会在内部创建热可观察对象并将它们传递到它们的流中。例如 groupBy 就是这种情况。 op1.op2.groupBy 是冷的,但它会发出热的可观察量作为结果流中的值。在这些情况下,只有文档(如果有的话)可以帮助您找到答案。否则,源代码和测试规范。或者在 SO 上询问。