冷热 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)
我有一个场景,我想从服务器获取一些数据,用户可以请求刷新这些数据。页面的其余部分需要更新以反映当前加载的数据迭代。
我想象的是我有一个热 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)