2016-08-20 12 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» против элемента управления, он выдает String «Привет» после 200 мс без ввода. Но если я хочу, чтобы это было действительно более отзывчивым, у меня действительно должно быть какое-то скользящее накопление для каждого ввода нажатия клавиши. Тогда мой вывод консоли действительно должен выглядеть следующим образом:

H 
He 
Hel 
Hell 
Hello 

Тех должен быть всеми моими выбросами, когда я ввожу слово «Hello», и 200мс определяет, сколько времени должно пройти до накопления возвратов. Как мне это сделать?

ответ

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

Вы можете использовать throttleLast вместо денонсации.

throttleLast будет издавать самые последние элементы, излучаемые наблюдаемом в периодических временных интервалах

throttleLast о/р консоли

H 
Hel 
Hello 
+0

Это чувствует себя ближе к решению, но по-прежнему получать отсрочку до того, как выбросы случаются ... – tmn

+1

Nice :) теперь, кажется, вы нашли решение. !! Как вы ответили. –

+1

Спасибо за вашу помощь. Это заставило меня начать, и сегодня я решил заняться прохождением давления в первый раз. – tmn