我已经开始玩RxJS5,现在看到不再有shareReplay
方法了.
很可能我经常shareReplay
在RxJS4中滥用,但现在我正在努力获得我想要的行为,即:
创建一个可观察的
订阅observable,observable产生一个值
第二次订阅observable,我得到相同的第一个值
Observable产生第二个值,两个订阅都获得第二个值
如何使用RxJS5实现此功能?
总的来说,我认为我对RxJS运算符非常了解,但对我来说,整个冷,热,发布,连接都不太清楚.有没有一个很好的参考,显示如何找到我有什么样的可观察,以便我可以以逻辑的方式找出为什么订阅没有获取值,或为什么一个observable被执行倍数?
编辑
快乐新闻,shareReplay()又回到了RxJS 5.4.0:
更新日志:https://github.com/ReactiveX/rxjs/blob/892700dd4f5d5e5f9ae9276ede32208f4390c5e9/CHANGELOG.md#540-2017-05-09
Barebones文档:http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-shareReplay
参与Rxjs5的成员最能回答这个问题,但这是我的看法:
shareReplay
是a的multicast
运算符ReplaySubject
,后跟a 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文档,您可以在其中找到有关冷热可观测量的解释.
在这里,并在这里是资源的一些例子.
遵循我自己目前对此事的理解:
受试者很热(大多数情况下反正,因为你可能认为重播主体的行为比冷观察者更接近)
除非明确另有说明,否则所有可观察物都是冷的.
明确的办法,使感冒观察到的热点之一,你有multicast
运营商及其衍生物share
,publish
,shareReplay
等这些运营商内部都涉及科目.
请注意,您不必看到使用这些运算符.但在这种情况下,API或文档应明确告诉您.例如,Rx.Observable.fromEvent('input','click')
很热.你可以在它的实现中看到有一个share
地方.
对于热/冷二分法,你必须添加connectable
直到它连接的那种,既不热也不冷.
defer
总是会产生寒冷的可观察性.
最后,一些运算符不会改变observable的性质,但会在内部创建热的observable并在其流中传递它们.例如,就是这种情况groupBy
.op1.op2.groupBy
很冷,但它会在结果流中发出热观察值作为值.在这些情况下,只有文档(如果有的话)可以帮助您找到答案.否则,源代码和测试规范.或者询问SO.