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

标签 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#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#thenMono#flatMap 的更原始版本,唯一的区别是 Mono#flatMap 里面您可以访问之前 Mono 的结果在一条链中,您可以将其转变为另一个链Mono实例。

除此之外,还有 Mono#then操作将按顺序执行,而 Mono#and不保证订购(至少从文档来看)。

关于java - Mono#then 和 Mono#and 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56184549/

相关文章:

java - 在共享首选项中保存可用余额

java-8 - 如何在 Project Reactor 中缓存项目并避免 Cache Stampede?

java - 是否建议将Arraylist转换为Reactor的flux来处理数据?

dart - 如何在rxdart流中使用Firebase快照

java - 如何让服务层在从数据库中获取任何内容时返回 Mono::error

java - 在 WebClient 中处理异常抛出 io.netty.handler.timeout.ReadTimeoutException

java - react 堆项目 : Enriching the result of a Flux with the result of a Mono

java - 如何使用 Java mongodb 驱动程序中的 "_id"字段查询文档?

java - 如何使用MongoTemplate按顺序获取结果?

java - 通过游标从列中获取值