Чем отличается использование doOnEach, onError, onComplete в подписке от вызова таких функций в Flux? - PullRequest
0 голосов
/ 14 июня 2019

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

Я посмотрел документы, ноЯ с трудом различаю два варианта использования

например

someflux.doOnEach(somefunction).doOnError(somehandling)

против

someflux.subscribe(somefunction, somehandling)

РЕДАКТИРОВАТЬ: исправлены неверные имена методов

1 Ответ

0 голосов
/ 16 июня 2019

Они очень тесно связаны.

Однако есть как минимум два варианта использования, когда вы должны использовать методы .doOn* (вместо аргументов .subscribe):

  1. Если вы хотите добавить побочные эффекты где-нибудь , а не и конец цепочки операторов (а не только в конце), ИЛИ
  2. Если вы не контролируете подписку

Более конкретно:

# 1 Размещение побочных эффектов в цепочке

Методы .doOn* могут быть размещены в любом месте в цепочке операторов. С другой стороны, аргументы .subscribe фактически всегда находятся на конце цепочки операторов.

Например, рассмотрим следующий надуманный пример:

Flux.range(0, 5)
        .doOnNext(i -> System.out.println("A: " + i))
        .filter(i -> i % 2 == 0)
        .doOnNext(i -> System.out.println("B: " + i))
        .subscribe(i -> System.out.println("C: " + i));

A будет видеть значения 0-4, но B и C будут видеть только 0, 2 и 4.

Обратите внимание, что B и C фактически одинаковы, поскольку оба работают с сигналами в конце цепочки операторов.

# 2 Когда вы не контролируете подписку

Есть много случаев, когда вы не звоните .subscribe самостоятельно. Вместо этого вы просто возвращаете Mono / Flux из вашего метода и позволяете подписаться чему-то более высокому в стеке. (Например: контроллеры WebFlux)

В этом случае, поскольку вы не вызываете .subscribe, вам нужно использовать операторы побочных эффектов, а не аргументы для .subscribe.

...