0

これは楽しい RxJava の問題です。

RxJava バックプレッシャー演算子を使用して、Google が検索ページで行うのと同じように、各文字が入力されている間に入力された入力をすばやく検索したいと考えています。バックプレッシャーのドキュメントを調べたところ、これを思いつきました (JavaFX を活用するために RxJavaFX/RxKotlinFX を使用しています) 。

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

これらは、「Hello」という単語を入力したときのすべての排出量である必要があり、200ms は蓄積がリセットされるまでの経過時間を定義します。どうすればいいですか?

4

2 に答える 2

0

非難する代わりに、throttleLastを使用できます。

throttleLast は、定期的な時間間隔内に Observable によって発行された最新のアイテムを発行します

スロットル最後の o/p コンソール

H
Hel
Hello
于 2016-08-21T07:29:27.977 に答える
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) }
于 2016-08-21T23:13:49.983 に答える