首页 文章

冷热观察 - 最后刷新 Value

提问于
浏览
0

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

我正在想象我有一个热的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 回答

  • 2

    根据我的理解,您可以使用以下形式的shareReplay运算符:

    echoStream = dataStream.shareReplay(1)

    正如文件所说:

    返回一个可观察的序列,它共享对基础序列的单个订阅并重放通知[...]此运算符是重放的特化,当观察者的数量从0变为1时连接到可连接的可观察序列,并在何时断开连接没有更多的观察员 .

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

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

    echoStream = dataStream.replay(1)

相关问题