Project Reactor的or()运算符使用问题

时间:2019-09-06 16:18:09

标签: reactive-programming project-reactor

我想链接Mono并发出它们的第一个非空值。我认为 or() 运算符就是为此目的而设计的。

这是我的Mono链:第一个是空的,第二个应该发出“你好”。

@Test
void orTest() {
    Mono<String> chain = Mono.<String>empty().or(Mono.just("hello"));

    StepVerifier.create(
        chain
    )
        .expectNext("hello")
        .verifyComplete();
}

但是,我遇到以下失败:

java.lang.AssertionError: expectation "expectNext(hello)" failed (expected: onNext(hello); actual: onComplete())

有人可以帮忙吗?我在这里错了吗?

1 个答案:

答案 0 :(得分:1)

您误解了or()-这需要来自任一发布者的first result emitted。这与发出的第一个 有很大的不同-如果Mono个对象中的一个发出了onComplete()个结果而没有返回任何内容,那么就像您的情况一样,得到的结果没有发出来。

如果您执行类似Mono.<String>empty().delaySubscription(Duration.ofMillis(100)).or(Mono.just("hello"));的操作,则可以看到此行为,几乎可以肯定会通过(因为空onComplete()的{​​{1}}结果对于其他{{ 1}}首先发出一个项目。)

但是,您使用的方法是switchIfEmpty(),该方法(顾名思义)将等待第一个Mono完成,如果第一个返回空结果,则回退到第二个:

Mono