Mono#then和Mono#and之间的区别?

时间:2019-05-17 10:27:59

标签: java reactive-programming project-reactor

给出以下单声道:

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#thenMono#and有什么区别?


来自https://projectreactor.io/docs/core/release/reference/index.html#which-operator

  

[如果您有一个序列,但是[您]对值不感兴趣,并且[您]希望最后切换到另一个Mono,请[使用] Mono#then(mono)

     

[如果您想通过协调从1个Mono终止的发布者和任何来源到一个Mono中来合并发布者,请[使用] Mono#and

这并不能帮助我找到#and#then不幸的情况。

1 个答案:

答案 0 :(得分:1)

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

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

除此之外,Mono#then的操作将按顺序执行,而Mono#and的操作则不能保证顺序(至少从文档开始)。