gpt4 book ai didi

java - Mono 的 doOnSuccess 与 doOnNext 之间有区别吗?

转载 作者:行者123 更新时间:2023-12-01 21:39:22 29 4
gpt4 key购买 nike

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

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

案例1: doOnSuccess

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

案例2: doOnNext

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

案例3: doOnSuccess + then (因为我希望在发出单声道完成之前完成分配)

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

最佳答案

阅读该类的文档 Mono 并查看图表。差异并不像看上去那么微妙:

  • Mono::doOnNext 当数据发送成功时触发,这意味着数据可用且存在。
  • Mono::doOnSuccess Mono 时触发成功完成 - 结果为 Tnull ,这意味着无论数据状态如何,处理本身都会成功完成,并且尽管数据不可用或不存在但管道本身会成功,但也会执行。
  • Mono::then 作为方法链的末尾返回 Mono<Void>完成和错误信号。
    • 请注意,这里有效负载被主动丢弃,这就是为什么变成 Mono<Void>来自Mono<T> 。请注意,上述两种方法不会丢弃有效负载。

请遵循以下说明性示例:

非空单声道

一个Mono保存值的触发器 doOnNext当数据发送成功时。这可能会让 doOnSuccess 感到困惑。 ,但与此类触发相反,doOnNext当发出任何成功值(包括空 Mono)时触发,仍然有效。

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

空单声道

请记住,尽管 Mono为空 ( Mono.empty() ),它仍然是触发 doOnSuccess 的有效响应,但不是doOnNext ,一个空Mono可以理解为一个有效的响应,但并不代表包含有用值的所需输出。它的工作原理与Optional.empty()相同。 。 Mono成功,但没有真正有用的值(value)来触发 doOnNext因为它根本不发出任何值。

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

错误的单声道

为了完整起见,与空的 Mono 进行对比,错误也不会触发 doOnNextdoOnSuccessdoOnError相反:

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

关于then的附注

方法Mono::then不带参数或其重写变体接受 Mono<V>丢弃之前的结果并提供新的 Mono<VoidMono<V>分别。

Mono.empty()
.then()
.doOnSuccess(i -> System.out.println("On success: " + i))
.doOnError(i -> System.out.println("On error: " + i))
.block();

Mono.empty()
.then(Mono.just("Good bye"))
.doOnSuccess(i -> System.out.println("On success: " + i))
.doOnError(i -> System.out.println("On error: " + i))
.block();

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

Mono.error(new RuntimeException("Something wrong"))
.then(Mono.just("Good bye"))
.doOnSuccess(i -> System.out.println("On success: " + i))
.doOnError(i -> System.out.println("On error: " + i))
.block();

Mono.error(new RuntimeException("Something wrong"))
.then(Mono.error(new RuntimeException("Something very wrong")))
.doOnSuccess(i -> System.out.println("On success: " + i))
.doOnError(i -> System.out.println("On error: " + i))
.block();
On success: null
On success: Good bye
On success: Good bye
On error: java.lang.RuntimeException: Something wrong
On error: java.lang.RuntimeException: Something wrong

关于java - Mono 的 doOnSuccess 与 doOnNext 之间有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55976963/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com