这是一个有趣的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) }
这很有效。如果我输入"你好"对照控制它会发出String
"你好" 200毫秒后没有打字。但是,如果我希望这真的更具响应性,我实际上应该为每个击键输入进行某种滚动累积。然后我的控制台输出应该看起来像这样:
H
He
Hel
Hell
Hello
当我输入单词" Hello"时,那些应该是我的所有排放,而200ms定义了在累积重置之前应该经过多长时间。我该怎么做?
答案 0 :(得分:0)
您可以使用throttleLast代替谴责。
throttleLast将在周期性时间间隔内发出Observable发出的最新项目
throttleLast o / p console
H
Hel
Hello
答案 1 :(得分:0)
知道了!我发现我实际上并不想要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) }