RxJS5 中 shareReplay(1) 的模式
Pattern for shareReplay(1) in RxJS5
我已经开始玩 RxJS5,现在发现不再有 shareReplay
方法。
很有可能我在 RxJS4 中经常误用 shareReplay
,但现在我正在努力获得我想要的行为,即:
- 创建一个可观察对象
- 订阅observable,observable产生一个值
- 第二次订阅 observable,我得到了相同的第一个值
- Observable 产生第二个值,两个订阅都得到第二个值
如何使用 RxJS5 实现它?
总的来说,我认为我对 RxJS 的操作符理解得很好,但是整个冷、热、发布、连接对我来说还是不太清楚。是否有一个很好的参考来说明如何找到我拥有的哪种可观察对象,以便我可以以合乎逻辑的方式找出为什么订阅没有获取值,或者为什么一个可观察对象被多次执行?
编辑
好消息,shareReplay() 又回到了 RxJS 5.4.0 中:
准系统文档:http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-shareReplay
这个问题最好由参与 Rxjs5 的成员回答,但这是我的看法:
shareReplay
是带有 ReplaySubject
的 multicast
运算符,后跟 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
运算符及其派生词 share
、publish
、shareReplay
等。这些运算符在内部都涉及科目。
- 请注意,您不必看到使用了这些运算符。但在那种情况下,API 或文档应该明确告诉您。例如,
Rx.Observable.fromEvent('input','click')
很热。你可以在它的实现中看到某处有一个share
。
- 到 hot/cold 二分法你必须添加
connectable
类型,直到它连接起来,它既不热也不冷。
defer
总是会产生一个冷的 observable。
- 最后,一些操作符不会改变可观察对象的性质,但会在内部创建热可观察对象并将它们传递到它们的流中。例如
groupBy
就是这种情况。 op1.op2.groupBy
是冷的,但它会发出热的可观察量作为结果流中的值。在这些情况下,只有文档(如果有的话)可以帮助您找到答案。否则,源代码和测试规范。或者在 SO 上询问。
我已经开始玩 RxJS5,现在发现不再有 shareReplay
方法。
很有可能我在 RxJS4 中经常误用 shareReplay
,但现在我正在努力获得我想要的行为,即:
- 创建一个可观察对象
- 订阅observable,observable产生一个值
- 第二次订阅 observable,我得到了相同的第一个值
- Observable 产生第二个值,两个订阅都得到第二个值
如何使用 RxJS5 实现它?
总的来说,我认为我对 RxJS 的操作符理解得很好,但是整个冷、热、发布、连接对我来说还是不太清楚。是否有一个很好的参考来说明如何找到我拥有的哪种可观察对象,以便我可以以合乎逻辑的方式找出为什么订阅没有获取值,或者为什么一个可观察对象被多次执行?
编辑
好消息,shareReplay() 又回到了 RxJS 5.4.0 中:
准系统文档:http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-shareReplay
这个问题最好由参与 Rxjs5 的成员回答,但这是我的看法:
shareReplay
是带有ReplaySubject
的multicast
运算符,后跟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
运算符及其派生词share
、publish
、shareReplay
等。这些运算符在内部都涉及科目。 - 请注意,您不必看到使用了这些运算符。但在那种情况下,API 或文档应该明确告诉您。例如,
Rx.Observable.fromEvent('input','click')
很热。你可以在它的实现中看到某处有一个share
。 - 到 hot/cold 二分法你必须添加
connectable
类型,直到它连接起来,它既不热也不冷。 defer
总是会产生一个冷的 observable。- 最后,一些操作符不会改变可观察对象的性质,但会在内部创建热可观察对象并将它们传递到它们的流中。例如
groupBy
就是这种情况。op1.op2.groupBy
是冷的,但它会发出热的可观察量作为结果流中的值。在这些情况下,只有文档(如果有的话)可以帮助您找到答案。否则,源代码和测试规范。或者在 SO 上询问。