RxJava – ¿Entradas de keyboard de contrapresión?

Aquí hay un problema divertido de RxJava.

Quiero usar los operadores de contrapresión de RxJava para search rápidamente una input mecanografiada mientras se escribe cada carácter, al igual que hace Google en su página de búsqueda. Revisé la documentation de Backpressure y se me ocurrió esto (estoy usando RxJavaFX / RxKotlinFX para aprovechar JavaFX).

val myControl: Node = ... val burstyMulticast = myControl.events(KeyEvent.KEY_TYPED).publish().refCount() val burstyDebounced = burstyMulticast.debounce(200, TimeUnit.MILLISECONDS) val burstyBuffenetworking = burstyMulticast.buffer(burstyDebounced) burstyBuffenetworking .flatMap { it.toObservable().map { it.character }.networkinguce("") { x,y -> x + y } } .subscribe { println(it) } 

Esto funciona genial Si escribo "Hola" contra el control, emitirá la String "Hola" después de 200 ms sin escribir. Pero si quiero que esto realmente sea más receptivo, en realidad debería tener algún tipo de acumulación progresiva para cada input de keyboard. Entonces mi salida de console realmente debería verse así:

 H He Hel Hell Hello 

Esas deberían ser todas mis emisiones cuando escribo la palabra "Hola", y los 200 ms definen cuánto time debe transcurrir antes de que se restablezca la acumulación. ¿Cómo hago esto?

Puede usar throttleLast en lugar de denunciar.

throttleLast emitirá los elementos más recientes emitidos por un Observable dentro de intervalos de time periódicos

throttleLast o / p console

 H Hel Hello 

¡Lo tengo! Descubrí que en realidad no quiero el buffer() , sino un switchMap() y un scan() dentro de él. Uso una multidifusión para controlar tanto la emisión de restablecimiento del timer introducida en switchMap() como la scan() que concatenará infinitamente los caracteres typescripts hasta que switchMap() mate para restablecerlo.

 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) } 
  • ¿Puedo crear un método de extensión Kotlin para agregar una suscripción rxJava a una suscripción compuesta?
  • RxKotlin collectInto () MutableList usando references de método
  • RxKotlin flattenAsObservable (): no coincide con el método de reference
  • No se puede cambiar el text de ActionMenuItemView con RxKotlin
  • ¿Expresar "súper" generics en los types funcionales de Kotlin?
  • Repetir acciones en estado con RxJava
  • Rx-Kotlin awaitTerminalEvent nunca se sube a Completo
  • RxJava2 Tal vez devuelva Observable vacío si no hay elemento
  • Llamada asincrónica para cada elemento dentro de una colección
  • La biblioteca de Kotlin 'rxkotlin-0.21.0.jar' tiene un formatting no compatible. Actualice la biblioteca o el complemento
  • Cómo notificar a Observable cuando finalice CountdownTimer