冷热 Observables - 上次刷新值

Hot & Cold Observables - Last Refresh Value

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

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

但是,我确实想保留上次发布的值,这样如果我动态启动需要访问相同数据的新组件,它就不会不必要地发送新请求。为此,我需要一个 Observable 位于热 Observable 之上,它只会保留和发出热 Observable 的最后一次发射。这是说明这个想法的图表:

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

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

echoStream 有点混合了 Hot 和 Cold Observable,历史保留有限。

rxjs 是否提供标准运算符来设置上面示例中的 echoStream 之类的东西?

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

echoStream = dataStream.shareReplay(1)

如文档所述:

Returns an observable sequence that shares a single subscription to the underlying sequence and replays notifications [...]

This operator is a specialization of replay that connects to the connectable observable sequence when the number of observers goes from zero to one, and disconnects when there are no more observers.

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

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

echoStream = dataStream.replay(1)