在订阅中使用doOnEach,onError,onComplete与在Flux上调用此类函数有什么区别?



我试图弄清楚两者之间是否有区别,但无法真正判断将它们放入订阅是否只是语法糖。

我已经看过文档,但很难区分这两个用例

例如

someflux.doOnEach(somefunction).doOnError(somehandling)

someflux.subscribe(somefunction, somehandling)

编辑:修复了不正确的方法名称

它们密切相关。

但是,至少有两种用例必须使用.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的值,但BC将只看到024

请注意,B 和 C 实际上是相同的,因为两者都在算子链末端对信号进行操作。

#2 当您不控制订阅时

在很多情况下,您不会自己打电话给.subscribe。 相反,您只需从方法中返回Mono/Flux,并允许堆栈中更高内容订阅。 (例如:WebFlux 控制器)

在这种情况下,由于您不调用.subscribe,因此您必须使用副作用运算符,而不是参数来.subscribe

最新更新