RxJS5中shareReplay(1)的模式

时间:2016-01-04 21:22:22

标签: javascript rxjs

我开始玩RxJS5,现在看到不再有shareReplay方法了。

我很可能经常在RxJS4中误用shareReplay,但现在我很难得到我想要的行为,即:

  • 创建一个可观察的
  • 订阅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

1 个答案:

答案 0 :(得分:22)

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

  • shareReplaymulticast运算符,ReplaySubject,后跟refCount。所以我敢打赌publishReplay(x).refCount()应该非常接近shareReplay行为。无论如何,publishReplay已经为您提供了所提到的所有要点。当没有更多观察者(refCount减少到0)时,refCount会添加取消订阅。
  • 您可以查看此处的规范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文档,您可以在其中找到有关冷热可观测量的解释。
  • Herehere是资源的一些示例。

遵循我对此事的现有理解:

  • 受试者很热(大多数情况下反正,因为你可能认为重播主题的行为比冷观察者更接近)
  • 除非另有明确说明,否则所有可观察物都是冷的。
  • 在使冷观察热的明确方法中,您有multicast运算符及其衍生物sharepublishshareReplay等。这些运算符内部都涉及受试者。
  • 请注意,您不必看到使用这些运算符。但在这种情况下,API或文档应明确告诉您。例如,Rx.Observable.fromEvent('input','click')很热门。您可以在其实现中看到某处有share
  • 到热/冷二分法,你必须添加connectable种类,直到它连接,既不热也不冷。
  • defer总会引起寒冷的观察。
  • 最后,一些运算符不会改变observable的性质,但会在内部创建热的observable并在其流中传递它们。例如groupBy就是这种情况。 op1.op2.groupBy很冷,但它会在结果流中将热观察值作为值发出。在这些情况下,只有文档(如果有的话)可以帮助您找到答案。否则,源代码和测试规范。或询问SO。