RxJava2 throttleFirst () - PullRequest
       11

RxJava2 throttleFirst ()

0 голосов
/ 06 января 2019

У меня есть 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 для [0 с - 1 с)
  • 1100 для [1 с - 2 с)
  • 2900 для [2 с - 3 с)
  • 3100 для [3 с - 4 с)
  • 4100 для [4с - конец)

Но я получаю все выше, кроме 3100 значения? Что может быть не так, и я не получаю это значение?

Полный источник можно найти здесь .

1 Ответ

0 голосов
/ 08 января 2019

Вы неправильно поняли, как работает 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-секундные интервалы (как наблюдаемые) и принимает первое значение каждого окна.

...