2016-08-20 5 views
0

ここに楽しいRxJavaの問題があります。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 msのタイピングがないとString "Hello"が出力されます。しかし、これを本当により敏感にしたいなら、私は実際にはキーストローク入力ごとにある種のローリング累積を行うべきです。その後、私のコンソール出力は、実際にこのようになります。

H 
He 
Hel 
Hell 
Hello 

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

答えて

0

がそれを手に入れました!私は実際にbuffer()がほしいとは思っていませんでしたが、むしろswitchMap()scan()がその中にあります。私は、switchMap()にプッシュされたタイマーリセットエミッションと、リセットするためにswitchMap()が殺されるまで、タイプされた文字を無限に連結するscan()の両方を駆動するためにマルチキャストを使用します。

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は、周期的な時間間隔

以内に観察可能で放出された最新のアイテムを放出するthrottleLast O/Pのコンソール

H 
Hel 
Hello 
+0

これは解決に近づきますが、排出が発生する前にまだ遅延が発生しています。 – tmn

+1

ニース:)解決策が見つかったようです。あなたが答えたように。 –

+1

あなたの助けをありがとう。それが私を始めてくれました。そして、私は今夜初めてバックプレッシャーを学ぶことに決めました。 – tmn