2016-08-20 4 views
0

Hier ist ein Spaß RxJava Problem.RxJava - Backpressuring Tastatureingaben?

Ich möchte RxJava Backpressure-Operatoren verwenden, um schnell eine eingegebene Eingabe zu suchen, während jedes Zeichen eingegeben wird, ähnlich wie Google auf seiner Suchseite. Ich ging durch die Backpressure Dokumentation und ich kam mit diesem (ich benutze RxJavaFX/RxKotlinFX, um JavaFX zu nutzen).

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

Das funktioniert super. Wenn ich "Hello" gegen das Steuerelement eintippe, wird es das String "Hello" nach 200 ms von keiner Eingabe ausgeben. Aber wenn ich möchte, dass dies wirklich reaktionsschneller ist, sollte ich tatsächlich eine Art rollierender Akkumulation für jede Tasteneingabe haben. Dann sollten meine Konsole Ausgabe wie folgt aussehen wirklich:

H 
He 
Hel 
Hell 
Hello 

Die sollten meine Emissionen alle, wenn ich das Wort „Hallo“ eingeben, und die 200 ms definiert, wie viel Zeit, bevor die Akkumulation setzt verstreichen soll. Wie mache ich das?

Antwort

0

Verstanden emittiert abgeben! Ich fand heraus, dass ich eigentlich nicht buffer(), sondern eine switchMap() und eine scan() innerhalb davon wollen. Ich benutze ein Multicast, um sowohl die Timer-Reset-Emission geschoben in switchMap(), als auch die scan(), die eingegebene Zeichen unendlich verketten, bis die switchMap() es zum Zurücksetzen tötet.

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

Sie können throttleLast anstelle von denunzieren verwenden.

throttleLast werden die neuesten Artikel von einer beobachtbaren innerhalb periodischen Zeitabständen

throttleLast o/p Konsole

H 
Hel 
Hello 
+0

Das fühlt sich näher an der Lösung, aber immer noch eine Verzögerung bekommen, bevor irgendwelche Emissionen passieren ... – tmn

+1

Nizza :) jetzt scheint es Ihnen Lösung gefunden zu haben. !! Wie du geantwortet hast. –

+1

Vielen Dank für Ihre Hilfe. Es hat mich dazu gebracht, zu lernen, und ich beschloss, heute Abend zum ersten Mal gegen den Lerndruck vorzugehen. – tmn