热门&冷可观测量 - 上次刷新值

时间:2016-03-16 18:40:09

标签: javascript typescript rxjs rxjs5

我有一个场景,我想从服务器获取一些数据,用户可以请求刷新这些数据。页面的其余部分需要更新以反映当前加载的数据迭代。

我正在想象我有一个热门的Observable,它发布了它加载的数据。我不想将数据的所有旧迭代保留为1.我只关心数据的最新迭代和2.如果用户在给定会话中刷新足够,则可能导致内存不足异常

但是,我想保留上次发布的值,这样如果我动态调出需要访问相同数据的新组件,它就不会不必要地发送新请求。为此,我需要一个Observable坐在热观测器的顶部,它只能保留并发出热观测值的最后一个发射。这是一个说明这个想法的图表:

dataStream     X - - - - - Y - - - - |> 
echoStream     X - - - - - Y - - - - |> 
subscription1  X - - - - - Y - - - - |> 
subscription2          X - Y - - - - |> 
subscription3                  Y - - |>

echoStream订阅了dataStream。 subscription1,subscription2和subscription3都订阅了echoStream,但是他们在不同的点订阅。在订阅时,它们获取从dataStream发出的最后一个值,并从dataStream接收后续更新。

echoStream是Hot和Cold Observable的混合体,具有有限的历史记录保留。

在上面的例子中,rxjs是否提供了设置echoStream之类的标准运算符?

1 个答案:

答案 0 :(得分:2)

根据我的理解,您可以使用此表单中的shareReplay运算符:

echoStream = dataStream.shareReplay(1)

正如文件所说:

  

返回一个可观察序列,该序列共享对基础序列的单个订阅并重放通知[...]

     

此运算符是重放的特化,当观察者的数量从0变为1时连接到可连接的可观察序列,并在没有更多观察者时断开连接。

所以这个运营商在这里做了两件事。当订阅者订阅流时,它立即接收流发出的最新值(或者n个最新值或者之前在Xms时间窗口中发出的值 - 取决于您在调用运算符时传递的参数)。这是重播功能。然后是自动取消订阅功能,当流不再有任何订阅者时启动。

如果您不关心自动取消订阅,则可以使用replay运算符,您将只获得重播功能。例如:

echoStream = dataStream.replay(1)