これは楽しい 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 は蓄積がリセットされるまでの経過時間を定義します。どうすればいいですか?