RxJava2节流阀First()

时间:2019-01-06 13:41:32

标签: java kotlin rx-java2

我有一个Flowable,在create()中,我正在执行以下操作:

it.onNext(0)
Thread.sleep(500) // 500ms
it.onNext(500)
Thread.sleep(600) // 1100ms
it.onNext(1100)
Thread.sleep(600) // 1700ms
it.onNext(1700)
Thread.sleep(1200) // 2900ms
it.onNext(2900)
Thread.sleep(200) // 3100ms
it.onNext(3100)
Thread.sleep(200) // 3300ms
it.onNext(3300)
Thread.sleep(800) // 4100ms
it.onNext(4100)

然后我正在使用throttleFirst(1, TimeUnit.SECONDS)来接收每发出1秒发出的第一个发射项。

经过一段时间,我认为我应该得到:

  • 0表示[0s-1s)
  • 1100(持续1s-2s)
  • 2900 for [2s-3s)
  • 3100 for [3s-4s)
  • 4100 for [4s-end)

但是,除了 3100 的价值之外,我还能收到上述所有款项吗?可能是什么问题,我没有收到此值?

完整的源代码可以找到here

1 个答案:

答案 0 :(得分:0)

您误解了throttleFirst的工作原理。

来自javadocs:

  

@param windowDuration

       time to wait before emitting another item after emitting the last item

这意味着不应发射3100,因为已经发射了2900,并且两者之间只有200毫秒,而不是1整秒。

如果您希望像上面所写的那样获得输出,可以使用:

.window(1, TimeUnit.SECONDS)
.flatMap { it.take(1) }

代替throttleFirst

这会将值分成1秒间隔(如可观察到的),并获取每个窗口的第一个值。