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) }
这是一个有趣的 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) }