我试图弄清楚两者之间是否有区别,但无法真正分辨出将它们扔进订阅中是否只是语法糖。
我看过文档,但是很难区分这两种用例
例如
someflux.doOnEach(somefunction).doOnError(somehandling)
与
someflux.subscribe(somefunction, somehandling)
编辑:修复了错误的方法名称
答案 0 :(得分:0)
它们之间有着密切的联系。
但是,至少有两种使用情况,您必须 使用.doOn*
方法(而不是.subscribe
的参数):
更具体地说:
.doOn*
方法可以放在操作员链中的任何地方。另一方面,.subscribe
的参数实际上总是在运算符链的 end 处。
例如,考虑以下人为的示例:
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实际上是相同的,因为它们都对操作员链末端的信号进行操作。
在很多情况下,您自己不会打电话给.subscribe
。取而代之的是,您只需从方法中返回Mono
/ Flux
,并允许堆栈中较高的内容进行订阅。 (例如:WebFlux控制器)
在这种情况下,由于您没有调用.subscribe
,因此必须使用副作用运算符,而不是.subscribe
的参数。