在事件流中等待静默期的RxJS运算符,但是在忙事件流的情况下不等待

时间:2018-06-01 12:28:08

标签: javascript rxjs

情景:

  • 我有一个事件流,每个事件都应该导致更新的信息显示(事件流来自websockets,显示在高图表中,但这并不重要)
  • 出于性能原因,我不想为每个事件触发UI更新。
  • 我宁愿做以下事情:

    • 当我收到一个事件时,我想进行UI更新,只是自上次更新以来超过X毫秒
    • 但是每隔Y毫秒(Y> X)我还是要进行更新,如果有任何传入的事件
    • 所以我正在寻找某种(组合)RxJS运算符,它将对事件流进行速率限制,以便仅在安静时段发生时发出事件(或者等待安静时段 - 最大时间具有已超出)。
    • 即。我想等待安静的时期,但不是永远。

我如何实现上述描述?

我看过:

1 个答案:

答案 0 :(得分:2)

您可以将timerdebounceTime合并,并使用它来对原始事件流进行抽样:

let $tick = Rx.Observable.timer(100, 100);
let $updates = $events
                  .sample($tick.merge($events.debounceTime(30))
                  .distinctUntilChanged();

这将每隔100毫秒发生一次事件,但如果事件发生在30毫秒的间隙之前也是如此。

使用sample时,将忽略采样流中的值。因此,该技术创建了一个包含基于时间的要求和去抖动的采样流。无论何时发生,都会从原始流中获取最新值。

如果没有任何更改,使用distinctUntilChanged可以防止连续重复的事件具有相同的值。如果您的数据是结构化的,或者无法与distinctUntilChanged进行比较,则可能需要将比较函数作为参数添加到===