我不知道如何使用 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 请求,您只需要知道它何时完成。
我不知道如何使用 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 请求,您只需要知道它何时完成。