RxJava - 背压键盘输入?

RxJava - Backpressuring keyboard inputs?

这是一个有趣的 RxJava 问题。

我想使用 RxJava 背压运算符在每个字符被键入时快速查找键入的输入,就像 Google 在其搜索页面上所做的那样。我浏览了 Backpressure 文档并想到了这个(我正在使用 RxJavaFX/RxKotlinFX 来利用 JavaFX)。

val myControl: Node = ...
val burstyMulticast = myControl.events(KeyEvent.KEY_TYPED).publish().refCount()
val burstyDebounced = burstyMulticast.debounce(200, TimeUnit.MILLISECONDS)
val burstyBuffered = burstyMulticast.buffer(burstyDebounced)

burstyBuffered
        .flatMap { it.toObservable().map { it.character }.reduce("") { x,y -> x + y } }
        .subscribe { println(it) }

效果很好。如果我针对控件键入 "Hello",它将在 200 毫秒无键入后发出 String "Hello"。但是,如果我想让它真正变得更灵敏,我实际上应该对每个击键输入进行某种滚动累积。然后我的控制台输出真的应该是这样的:

H
He
Hel
Hell
Hello

当我输入 "Hello" 时,这些应该是我所有的发射,而 200 毫秒定义了在累加重置之前应该经过多少时间。我该怎么做?

可以用throttleLast代替斥责。

throttleLast 将在周期性时间间隔内发出 Observable 发出的最新项目

throttleLast o/p 控制台

H
Hel
Hello

知道了!我发现我实际上不想要 buffer(),而是里面有一个 switchMap() 和一个 scan()。我使用多播来驱动推入 switchMap() 的计时器重置发射和 scan(),后者将无限连接键入的字符,直到 switchMap() 将其杀死以进行重置。

val burstyMulticast = events(KeyEvent.KEY_TYPED).publish().refCount().map { it.character }

burstyMulticast.throttleLast(1000, TimeUnit.MILLISECONDS).startWith("")
        .switchMap {
            burstyMulticast.scan { x,y -> x + y }
        }.subscribe { println(it) }