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”,它将String在 200 毫秒无输入后发出“Hello”。但如果我想让它真正响应更快,我实际上应该为每个按键输入进行某种滚动累积。然后我的控制台输出应该看起来像这样:

H
He
Hel
Hell
Hello

当我输入“你好”这个词时,这些应该是我的全部排放,而 200 毫秒定义了在累积重置之前应该经过多长时间。我该怎么做呢?

4

2 回答 2

0

您可以使用throttleLast而不是谴责。

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

油门最后 o/p 控制台

H
Hel
Hello
于 2016-08-21T07:29:27.977 回答
0

知道了!我发现我实际上不想要buffer(),而是 aswitchMap()和 ascan()里面。我使用多播来驱动推入的计时器重置发射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) }
于 2016-08-21T23:13:49.983 回答