首页 文章

RxJava - 背压键盘输入?

提问于
浏览
0

这是一个有趣的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 回答

  • 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) }
    
  • 0

    您可以使用throttleLast而不是退订 .

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

    throttleLast o / p控制台

    H
    Hel
    Hello
    

相关问题