Понимание наблюдателя в мониксе - PullRequest
0 голосов
/ 23 мая 2018

Я читаю Документация Monix о наблюдателях и я столкнулся со следующим примером:

Или вы можете быстропостроить Обозреватель, который только регистрирует события, которые он получает.Мы будем использовать это в других примерах:

import monix.reactive.Observer

val out = Observer.dump("O")
// out: Observer.Sync[Any]

out.onNext(1)
//=> 0: O-->1
// res0: Ack = Continue

out.onNext(2)
//=> 1: O-->2
// res0: Ack = Continue

out.onComplete()
//=> 2: O completed

Еще следующий НЕЗАКОННЫЙ пример:

Подача двух элементов, затем остановка.Это НЕ законно:

// BAD SAMPLE
observer.onNext(1)
observer.onNext(2)
observer.onComplete()

Таким образом, мы можем видеть ту же цепочку onNext -> onNext -> onComplete.Разве это не законно?Почему?

1 Ответ

0 голосов
/ 23 мая 2018

В документации, которую вы связали, это объясняется непосредственно после примера ?

Это законный способ сделать это:

observer.onNext(1).map {
  case Continue =>
    // We have permission to continue
    observer.onNext(2)
    // No back-pressure required here
    observer.onComplete()
    Stop
  case Stop =>
    // Nothing else to do
    Stop
}

Как вы можете видеть в комментарияхпроблема в обратное давление .Так почему же есть пример использования .dump, который кажется недопустимым?

Обратите внимание на комментарии в этом примере:

//=> 0: O-->1
// res0: Ack = Continue

Эти комментарии показывают, что вы получите, если вы запуститеэто в Scala REPL.Когда вы вводите выражение и нажимаете return, REPL печатает что-то вроде res0 и сообщает вам, какое значение было возвращено последней командой.

Итак, этот пример демонстрирует:

  • Подача Наблюдателя из REPL
  • , который каждый .onNext завершил с Continue

Было бы неправильно написать программу, которая будет кормить Обозревателя в этомкстати, но это правильная транскрипция законного выполнения кормления наблюдателя.

Вы можете увидеть правила, относящиеся к противодавлению, под Контрактный раздел :

Обратное давление: каждый вызов onNext ДОЛЖЕН ждать результата Continue, возвращаемого Future [Ack] предыдущего вызова onNext. Обратное давление для onComplete и onError является необязательным: при вызове onComplete или onErrorвам не нужно ждать будущего [Ack] предыдущего onNext.

Это хороший момент, на котором стоит остановиться, поскольку элегантное управление обратным давлением является одним из больших обещанийреактивные потоки.

...