java - Mono#then 和 Mono#and 之间的区别?
问题描述
鉴于以下单声道:
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:
[如果您] 有一个序列,但 [您] 对值不感兴趣,并且 [您] 想在最后切换到另一个 Mono,[使用]
Mono#then(mono)
。[如果您] 想通过将发布者从 1 Mono 和任何来源的终止协调到 Mono 中来组合发布者,[使用]
Mono#and
。
#and
不幸的是,这无助于我找到一个#then
行为不同的案例。
解决方案
Mono#and
只是“将来自当前单声道和另一个源的终止信号加入返回的空单声道”。它总是返回Mono<Void>
并且只允许你协调两个Mono
s 的终止。
Mono#then
让您将两个Mono
s 链接在一起,最终结果将由Mono
作为参数传递的决定。从这个意义上说,Mono#then
是一个更原始的版本Mono#flatMap
,唯一的区别是Mono#flatMap
你可以访问Mono
链中前一个的结果,你可以将其转换为另一个Mono
实例。
除此之外, withMono#then
操作将按顺序执行,而 withMono#and
不保证顺序(至少从文档中)。
推荐阅读
- javascript - 如何在 PHP 中附加选项元素和值并在 ajax 中调用 html
- python - 散点图的 Matplotlib 2D 条形图未按预期排列
- r - 如何在 Shiny 中验证上传的 csv
- r - 在数据框中重复值时,仅保留每个 id 的第一个值
- oracle - 知道 JDBC 连接字符串的 Oracle 数据库的 ODBC 连接字符串是什么
- laravel - Laravel 任务调度是否适用于 5 分钟的 cron 作业?
- swift - SwiftUI如何在标签点击时刷新
- python - 如何使用python准备这种形式的数据
- amazon-web-services - 当我们在不附加 vpc 的情况下部署 lambda 资源时会发生什么?
- java - 在 C++ 和 Java 中是否有任何类似的类可用作为“pyautogui”?