对于单声道,doOnSuccess与doOnNext之间有区别吗?

假设您有并且想要将其分配给变量。Mono<Integer> someIntegerSource = Mono.just(5)

这些代码片段之间有区别吗?

案例1:doOnSuccess

someIntegerSource.doOnSuccess(number -> this.myNumber = number)

案例2:doOnNext

someIntegerSource.doOnNext(number -> this.myNumber = number)

情况3:doOnSuccess +然后(因为我想在发出完成单声道之前完成分配)

someIntegerSource.doOnSuccess(number -> this.myNumber = number).then()

答案 1

阅读 Mono 类的文档并查看图表。他们对行为的解释非常清楚。几乎没有明显的差异,但它们仍然是:

  • Mono::d oOnNext 在成功发出数据时触发,这意味着数据可用且存在。
  • Mono::d oOnSuccess 在成功完成时触发 - 结果为 or 或 ,这意味着无论数据的状态如何,处理本身都已成功完成,尽管数据不可用或不存在,但管道本身成功。MonoTnull
  • Mono::然后作为方法链的末端返回完成和错误信号。Mono<Void>
    • 请注意,此处的有效负载被主动丢弃,这就是为什么从 .请注意,上述两种方法不会丢弃有效负载。Mono<Void>Mono<T>

这个答案缺乏一个适当的说明性示例,所以我即将修复它:

非空单声道

在成功发出数据时保存值触发器的 A。这可能会使 混淆 ,但与此类触发器相反,当发出任何成功的值(包括空值)时,将触发该触发器,该值仍然有效。MonodoOnNextdoOnSuccessdoOnNextMono

Mono.just("Hello World")
    .doOnNext(i -> System.out.println("On next: " + i))
    .doOnSuccess(i -> System.out.println("On success: " + i))
    .doOnError(i -> System.out.println("On error: " + i))
    .block();
On next: Hello World
On success: Hello World

空单声道

请记住,尽管 是空的 (),但它仍然是触发 的有效响应,但是不是 ,空可以理解为具有有效响应的响应,该响应不表示包含有用值的所需输出。它的工作原理与 相同。是成功的,但没有会触发的真正有用的值,因为它根本不发出任何值。MonoMono.empty()doOnSuccessdoOnNextMonoOptional.empty()MonodoOnNext

Mono.empty()
    .doOnNext(i -> System.out.println("On next: " + i))
    .doOnSuccess(i -> System.out.println("On success: " + i))
    .doOnError(i -> System.out.println("On error: " + i))
    .block();
Mono.just("Hello World")
    .mapNotNull(s -> null)
    .doOnNext(i -> System.out.println("On next: " + i))
    .doOnSuccess(i -> System.out.println("On success: " + i))
    .doOnError(i -> System.out.println("On error: " + i))
    .block();

两者都产生相同的输出:

On success: null

错误的单声道

为了完整起见,与空的相反,错误不会触发其中任何一个,而是会触发:MonodoOnNextdoOnSuccessdoOnError

Mono.error(new RuntimeException("Something wrong"))
    .doOnNext(i -> System.out.println("On next: " + i))
    .doOnSuccess(i -> System.out.println("On success: " + i))
    .doOnError(i -> System.out.println("On error: " + i))
    .block();
On error: java.lang.RuntimeException: Something wrong

答案 2

推荐