首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mono#then与Mono#and的差异?

Mono#then与Mono#and的差异?
EN

Stack Overflow用户
提问于 2019-05-17 10:27:59
回答 1查看 1.7K关注 0票数 2

考虑到以下情况:

代码语言:javascript
复制
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");
});

两者均:

代码语言:javascript
复制
mono1
        .then(mono2)
        .then(mono3)
        .block();

和:

代码语言:javascript
复制
mono1
        .and(mono2)
        .and(mono3)
        .block();

具有相同的输出:

代码语言:javascript
复制
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很不幸会有不同的行为。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-17 13:46:07

Mono#and只是“将来自当前单点和另一个源的终止信号连接到返回的空单点”。它总是返回Mono<Void>,并且只允许您协调两个Mono的终止。

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

此外,对于Mono#then,操作将按顺序执行,而对于Mono#and,则无法保证排序(至少从文档中)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56184549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档