【问题标题】:RxJava - Backpressuring keyboard inputs?RxJava - 背压键盘输入?
【发布时间】:2016-08-20 18:25:27
【问题描述】:

这是一个有趣的 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 毫秒无输入后发出 String“Hello”。但如果我想让它真正响应更快,我实际上应该为每个按键输入进行某种滚动累积。那么我的控制台输出应该是这样的:

H
He
Hel
Hell
Hello

当我输入“你好”这个词时,这些应该是我的所有排放量,而 200 毫秒定义了在累积重置之前应该经过多长时间。我该怎么做?

【问题讨论】:

    标签: javafx rx-java kotlin backpressure rx-kotlin


    【解决方案1】:

    您可以使用throttleLast 而不是谴责。

    throttleLast 将在周期性时间间隔内发出 Observable 发出的最新项目

    throttleLast o/p 控制台

    H
    Hel
    Hello
    

    【讨论】:

    • 这感觉更接近解决方案,但在任何排放发生之前仍然会延迟......
    • 很好 :) 现在看来您找到了解决方案。!!正如你所回答的那样。
    • 感谢您的帮助。它让我开始了,我决定今晚第一次解决学习背压问题。
    【解决方案2】:

    知道了!我发现我实际上不想要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) }
    

    【讨论】:

      猜你喜欢
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多