Javascript RxJS5中shareReplay(1)的模式

Javascript RxJS5中shareReplay(1)的模式,javascript,rxjs,Javascript,Rxjs,我已经开始使用RxJS5,现在看到不再有shareReplay方法了 很可能我经常在RxJS4中误用shareReplay,但现在我正努力获得我想要的行为,即: 创建一个可观察的 订阅可观察对象,可观察对象产生一个值 第二次订阅可观测值,我会得到相同的第一个值 Observable生成第二个值,两个订阅都获得第二个值 如何使用RxJS5实现这一点 总的来说,我认为我对RxJS操作符非常了解,但是整个冷、热、发布、连接对我来说是相当不清楚的。是否有一个很好的参考来说明如何找到我所拥有的哪种类型

我已经开始使用RxJS5,现在看到不再有
shareReplay
方法了

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

  • 创建一个可观察的
  • 订阅可观察对象,可观察对象产生一个值
  • 第二次订阅可观测值,我会得到相同的第一个值
  • Observable生成第二个值,两个订阅都获得第二个值
如何使用RxJS5实现这一点

总的来说,我认为我对RxJS操作符非常了解,但是整个冷、热、发布、连接对我来说是相当不清楚的。是否有一个很好的参考来说明如何找到我所拥有的哪种类型的可观察对象,以便我能够以逻辑的方式找出为什么订阅没有得到值,或者为什么一个可观察对象被多次执行

编辑

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

更改日志:


赤裸裸的文档:

这个问题最好由参与Rxjs5的成员来回答,但以下是我的观点:

  • shareReplay
    是具有
    ReplaySubject
    multicast
    操作符,后跟
    refCount
    。所以我敢打赌,
    publishReplay(x).refCount()
    应该非常接近
    shareReplay
    的行为。无论如何,
    publishReplay
    已经给出了您提到的所有要点。当没有更多观察者时,
    refCount
    添加取消订阅(
    refCount
    减少到0)
  • 你可以看看这里的规格。请参见第127行之后的
    var replayed=source.publishReplay(1.refCount()
    ,它应该相当于您的
    共享重播(1)
关于你剩下的问题:

  • 我想我们都希望有一个好的参考资料,说明如何找到我所拥有的可观察到的东西…。有很多地方,包括Rxjs4文档,您可以在其中找到有关热观测和冷观测的解释
  • ,和是一些资源示例
根据我目前对此事的理解:

  • 受试者是热的(大多数情况下,你可能会认为重播受试者的行为更接近于冷的可观察对象)
  • 除非另有明确规定,否则所有的观测都是冷的
  • 在使冷可见热的显式方法中,有
    多播
    操作符及其派生的
    共享
    发布
    共享重播
    等。这些操作符内部都涉及主题
  • 请注意,使用这些运算符时,不必对您可见。但是在这种情况下,API或文档应该明确地告诉您。例如,
    Rx.Observable.fromEvent('input','click')
    是热的。您可以在它的实现中看到,在某个地方有一个
    共享
  • 在热/冷二分法中,您必须添加可连接的
    类型,在连接之前,它既不热也不冷
  • 延迟
    总是会引起冷场
  • 最后,一些操作符不会改变可观察对象的性质,但会在内部创建热的可观察对象,并在流中传递它们。例如,
    groupBy
    就是这样
    op1.op2.groupBy
    是冷的,但它将在结果流中发出热的可观测值作为值。在这些情况下,只有文档(如果有)可以帮助您找到答案。否则,源代码和测试规范。或者这样问

非常感谢!publishReplay(1)之后是connect()解决了我的特定问题[事实上,也许shareReplay(1)不会解决它…]您编写的其余内容非常有用,我将使用这些内容和链接来逐步了解所有内容。提示何时使用:如果您在网络选项卡(chrome devtools下)中看到许多对同一位置的调用和此调用具有相同的数据(例如从资产文件夹调用文件或调用其内容未更改的api时)使用shareReplay。