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

时间:2019-06-14 20:28:32

标签: spring project-reactor

我试图弄清楚两者之间是否有区别,但无法真正分辨出将它们扔进订阅中是否只是语法糖。

我看过文档,但是很难区分这两种用例

例如

someflux.doOnEach(somefunction).doOnError(somehandling)

someflux.subscribe(somefunction, somehandling)

编辑:修复了错误的方法名称

1 个答案:

答案 0 :(得分:0)

它们之间有着密切的联系。

但是,至少有两种使用情况,您必须 使用.doOn*方法(而不是.subscribe的参数):

  1. 如果您想在不是的某个位置和操作符链的末尾(而不是仅在末尾)添加副作用,或者
  2. 如果您无法控制订阅

更具体地说:

#1副作用行为在链中的位置

.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,但是BC将仅看到024

请注意,B和C实际上是相同的,因为它们都对操作员链末端的信号进行操作。

#2当您无法控制订阅时

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

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