我试图弄清楚两者之间是否有区别,但无法真正判断将它们放入订阅是否只是语法糖。
我已经看过文档,但很难区分这两个用例
例如
someflux.doOnEach(somefunction).doOnError(somehandling)
对
someflux.subscribe(somefunction, somehandling)
编辑:修复了不正确的方法名称
它们密切相关。
但是,至少有两种用例必须使用.doOn*
方法(而不是要.subscribe
的参数):
- 如果您想在某个地方添加副作用,而不是运算符链的末端(而不仅仅是在末端),或者
- 如果您不控制订阅
更具体地说:
#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
。