首页 > 解决方案 > 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行为不同的案例。

标签: javareactive-programmingproject-reactor

解决方案


Mono#and只是“将来自当前单声道和另一个源的终止信号加入返回的空单声道”。它总是返回Mono<Void>并且只允许你协调两个Monos 的终止。

Mono#then让您将两个Monos 链接在一起,最终结果将由Mono作为参数传递的决定。从这个意义上说,Mono#then是一个更原始的版本Mono#flatMap,唯一的区别是Mono#flatMap你可以访问Mono链中前一个的结果,你可以将其转换为另一个Mono实例。

除此之外, withMono#then操作将按顺序执行,而 withMono#and不保证顺序(至少从文档中)。


推荐阅读