Rx debounce operator with first 和 last

Rx debounce operator with first and last

是否有rx运算符的任何组合以获得第一个和最后一个去抖动事件?

这将用于我们希望在用户停止更改选择后立即加载第一个选定项目和最后一个选定项目的主细节场景(甚至搜索场景)。

这将防止在用户缓慢导航时注入去抖动时间,同时也防止突发变化。

如果 debounce operator had an option "immediate" like underscore.js debounce functoin 那么合并 2 个版本的 debounce 运算符将生成所需的结果。

要获得第一个去抖动的元素,您可以使用throttle. To get the last, you can use debounce。但是,您应该确保您正在去抖动或节流的源是热源,因为您会将两个运算符应用于同一源。然后,如果您希望两个元素都在同一个可观察对象中,那么您可以合并节流和去抖流。

例如,调用 source$ 您的源可观察对象:

firstAndLast$ = Rx.Observable.merge(source$.debounce(Xms), source$.throttle(Xms))

这应该在同一流中发出突发的第一项和最后一项。请注意,在极端情况下,这不是突发,而是 Xms 时间段内出现的单个值,您可能有两次相同的值,一个在时间段开始,一个在时间段结束。一种防止这种情况的方法,如果有意义的话是使用 distinctUntilChanged,所以这变成:

firstAndLast$ = Rx.Observable.merge(source$.debounce(Xms), source$.throttle(Xms)).distinctUntilChanged()

具有用户体验友好行为的混合运算符:https://www.npmjs.com/package/rx-op-debounce-throttle

发出批次中的第一个和最后一个项目,加上 window 内尽可能多的事件,至少间隔 X 毫秒。

仅按照上一个答案中的建议组合油门和去抖对我来说还不够,因为它会在油门时间用完时定期发出新事件。

const debounced$ = source$.debounceTime(time)
return source$.throttleTime(time)
  .merge(debounced$).distinctUntilChanged()

有了 time=30 你会得到:

-a-a-a-a-a-a----
-a---a---a----a-

为了只获取第一个和最后一个事件之间最短的时间,我使用了:

const debounced$ = source$.debounceTime(time)
return source$.throttle(() => debounced)
  .merge(debounced$).distinctUntilChanged()

这导致:

-a-a-a-a-a-a----
-a------------a-