这是一个有趣的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”时,那些应该是我的所有排放,200ms定义在累积重置之前应该经过多长时间 . 我该怎么做呢?
2 回答
得到它了!我发现我实际上并不想要
buffer()
,而是需要switchMap()
和scan()
. 我使用多播来驱动推入switchMap()
的定时器重置发射,以及scan()
,它将无限连接类型字符,直到switchMap()
将其重置为重置 .您可以使用throttleLast而不是退订 .
throttleLast将在周期性时间间隔内发出Observable发出的最新项目
throttleLast o / p控制台