我不知道如何使用 Project Reactor 的 then 运算符

I don't know how to use the then operator of Project Reactor

我不知道如何使用 Project Reactor 的 then 运算符。我不太明白这个操作员的javadoc。谁能给我解释一下?有一些代码示例会很棒。我自己写了一个例子如下:

public class Test11 {
    public static void main(String[] args) {
        Flux flux = Flux.just(1, 2, 3);
        Mono<Void> mono1 = flux.then();
        mono1.subscribe(null, null, () -> System.out.println("yes1"));
        flux.subscribe(System.out::println, System.err::println);
    }
}

我以为结果会是:

1

2

3

yes1

但实际结果是:

yes1

1

2

3

请帮助我。并且我希望你能写一些代码示例并且不限制我在这里写的这个例子。

then() 当您不关心发布者输出了哪些元素,您只关心它何时完成时使用。所以它需要一个现有的发布者,扔掉它的所有元素,然后传播完成信号。

但是,我不确定您在这里的误解来自 then() 运算符本身,而是反应式发布者在订阅时的行为(并且可能所有反应式链都是不可变的。)与这里相关:

  • 在您订阅之前什么都不会发生;
  • 可以多次订阅,每次订阅时整条链都会重新执行
  • 每当您在链上使用运算符时,都会创建该反应链的新副本并附加新的运算符 - 您不会改变现有链。

所以在这种情况下,逐行:

  • 我们有一个 flux 链,它会在订阅后立即发出 3 个元素 (1,2,3)
  • 我们有一个 mono1 链,它不会发出任何东西并立即完成(因为它是从上面 flux 创建的,所以没有什么可等待的)
  • 我们使用订阅者订阅 mono1 链,该订阅者在完成时除了打印 yes1 外什么都不做 - 并且根据上述内容,它立即完成并打印 yes1
  • 我们通过订阅者订阅原始通量,该订阅者在每个元素发出时打印它,因此它会打印 1、2 和 3。

如果您只想在发布者完成时打印通知 (yes1),那么您可以完全废弃 mono1,执行以下操作:

flux.subscribe(System.out::println, System.err::println, () -> System.out.println("yes1"));

...这将为您提供预期的输出。

then() 运算符在这里真的没有用,因为它总是会立即完成。如上。你只会在你必须等待某事完成的情况下真正使用它,并且你不关心它在此期间可能发出的任何东西 - 例如,你有大量想要执行的数据库更新并且您只关心它们何时完成,或者您正在发出不需要结果的 PUT 请求,您只需要知道它何时完成。