有人可以解释 Reactor Mono 流中 .then() 方法的注意事项吗?



我有两个测试功能,我希望返回相同的结果。第一个(monotest3(在" .then(("方法中使用lambda表达式。第二个没有。

为什么我会得到结果?

使用Reactivex和Lambda表达式工作时有些事情和不做什么?

在Monotest 3下方的代码中产生

monoVoid called
Success
----
monoVoid2 called
Success

和monotest4产生(期望的结果(:

monoVoid called
monoVoid2 called
Success
----
monoVoid2 called
monoVoid called
Success

最后是代码。

private static Mono<Void> monoVoid() {
    System.out.println("monoVoid called");
    return Mono.empty();
}
private static Mono<Void> monoVoid2() {
    System.out.println("monoVoid2 called");
    return Mono.just("Hello").then();
}
@Test
public void monoTest3() throws Exception {
    monoVoid()
            .then( v -> monoVoid2())
            .doOnSuccess(v -> System.out.println("Success"))
            .block();
    System.out.println("----");
    monoVoid2()
            .then( v -> monoVoid())
            .doOnSuccess(v -> System.out.println("Success"))
            .block();
}
@Test
public void monoTest4() throws Exception {
    monoVoid()
            .then( MonoTest::monoVoid2 )
            .doOnSuccess(v -> System.out.println("Success"))
            .block();
    System.out.println("----");
    monoVoid2()
            .then(MonoTest::monoVoid)
            .doOnSuccess(v -> System.out.println("Success"))
            .block();
}

实际上在3.0.7中弃用了此Mono.then(Function),并且将在3.1.0中删除,因为它的行为与Mono中的所有其他then方法略有不同,因此我们预见人们像您一样感到困惑。

在3.1.0中(当前在里程碑2中,因此3.1.0.M2(现在称为flatMap,返回Flux的旧flatmap现在是flatMapMany

这可以更好地传达正确的语义,如果您对flatMap有所了解,那么您可以正确地推断出"持续单声道"只能生成并订阅Mono被重视时。

换句话说,调用Mono.just("foo").then().then(v -> {...})(3.0.x版本(或Mono.just("foo").then().flatMap(v -> {...})(3.1.0版本(没有任何意义,因为第一个then()具有没有发出值的效果。没有一个值,lambda并未被调用(其角色是将值转换为持续的单声道。出于相同的原因致电Mono.empty().then(v -> {})毫无意义。

最新更新