【问题标题】:Hot & Cold Observables - Last Refresh ValueHot & Cold Observables - 上次刷新值
【发布时间】:2016-07-02 20:13:04
【问题描述】:

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

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

但是,我确实希望保留最后发布的值,这样如果我动态启动需要访问相同数据的新组件,它就不会不必要地发送新请求。为此,我需要一个 Observable 放在 hot observable 之上,它只会保留并发出 hot 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 之类的东西?

【问题讨论】:

    标签: javascript typescript rxjs rxjs5


    【解决方案1】:

    据我了解,您可以以这种形式使用shareReplay 运算符:

    echoStream = dataStream.shareReplay(1)

    正如文档所说:

    返回一个可观察的序列,该序列共享一个对底层序列的订阅并重播通知 [...]

    这个操作符是重放的一种特殊化,当观察者的数量从零到一时连接到可连接的可观察序列,当没有更多的观察者时断开连接。

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

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

    echoStream = dataStream.replay(1)

    【讨论】:

    • 谢谢,我试试看
    猜你喜欢
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多