Понимание наблюдателя в monix

62
6

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

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

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 цепочку. Разве это не законно? Зачем?

спросил(а) 2021-01-19T21:31:47+03:00 2 месяца, 3 недели назад
1
Решение
62

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

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

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. Когда вы вводите выражение и res0 return, REPL печатает что-то вроде res0 и позволяет узнать, каково было возвращаемое значение последней команды.

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

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

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

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

Back-pressure: каждый вызов onNext должен ждать результата Continue, возвращаемого Future [Ack] предыдущего вызова onNext. Back-pressure для onComplete и onError не является обязательным: при вызове onComplete или onError вам не нужно ждать в будущем [Ack] предыдущего onNext.

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

ответил(а) 2021-01-19T21:31:47+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема