给定以下单声道:
Mono<Void> mono1 = Mono.fromRunnable(() -> {
System.out.println("sleep1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
System.out.println("mono1");
});
Mono<Void> mono2 = Mono.fromRunnable(() -> {
System.out.println("mono2");
});
Mono<Void> mono3 = Mono.fromRunnable(() -> {
System.out.println("mono3");
});
两者:
mono1
.then(mono2)
.then(mono3)
.block();
还有:
mono1
.and(mono2)
.and(mono3)
.block();
具有相同的输出:
sleep
mono1
mono2
mono3
Mono#then
和有什么区别和 Mono#and
在这种情况下?
来自https://projectreactor.io/docs/core/release/reference/index.html#which-operator :
[If you] have a sequence but [you are] not interested in values and [you] want to switch to another Mono at the end, [use]
Mono#then(mono)
.[If you] want to combine publishers by coordinating their termination from 1 Mono and any source into a Mono, [use]
Mono#and
.
不幸的是,这并不能帮助我找到 #and
和 #then
表现不同的情况。
最佳答案
Mono#and
只是“将来自当前单声道和另一个源的终止信号加入到返回的空单声道中”。它总是返回 Mono<Void>
并且只允许您协调两个 Mono
的终止s。
Mono#then
让您链接两个Mono
在一起,最终结果将由 Mono
决定作为参数传递。从这个意义上说,Mono#then
是 Mono#flatMap
的更原始版本,唯一的区别是 Mono#flatMap
里面您可以访问之前 Mono
的结果在一条链中,您可以将其转变为另一个链Mono
实例。
除此之外,还有 Mono#then
操作将按顺序执行,而 Mono#and
不保证订购(至少从文档来看)。
关于java - Mono#then 和 Mono#and 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56184549/