Rx debounce运算符有第一个和最后一个

Geo*_*kis 7 javascript system.reactive rxjs angular

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

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

这可以防止在用户缓慢导航时注入去抖时间,但也可以防止突发变化.

如果debounce运算符有一个"立即"选项,如underscore.js debounce functoin那么两个版本的debounce运算符的合并将产生所需的结果.

use*_*222 10

要获得第一个debounced元素,您可以使用throttle.要获得最后一个,你可以使用debounce.但是,您应该确保您正在进行去抖动或限制的源是一个热门来源,因为您将两个运算符应用于同一个源.然后,如果你想要两个元素在同一个observable中,那么你可以合并限制和去抖动的流.

例如,调用source$source observable:

firstAndLast$ = Rx.Observable.merge(source$.debounce(Xms), source$.throttle(Xms))
Run Code Online (Sandbox Code Playgroud)

这应该在同一个流中发出一个突发的第一项和最后一项.请注意,在边缘情况下,这不是一个突发,而是在Xms时间段内发生的单个值,您可能有两倍相同的值,一个在句点的开头,一个在结尾.一种防止这种情况的方法,如果有意义的话就是使用distinctUntilChanged,所以这就成了:

firstAndLast$ = Rx.Observable.merge(source$.debounce(Xms), source$.throttle(Xms)).distinctUntilChanged()
Run Code Online (Sandbox Code Playgroud)


Way*_*ner 5

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

const debounced$ = source$.debounceTime(time)
return source$.throttleTime(time)
  .merge(debounced$).distinctUntilChanged()
Run Code Online (Sandbox Code Playgroud)

使用 atime=30你会得到:

-a-a-a-a-a-a----
-a---a---a----a-
Run Code Online (Sandbox Code Playgroud)

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

const debounced$ = source$.debounceTime(time)
return source$.throttle(() => debounced)
  .merge(debounced$).distinctUntilChanged()
Run Code Online (Sandbox Code Playgroud)

结果是:

-a-a-a-a-a-a----
-a------------a-
Run Code Online (Sandbox Code Playgroud)