我想链接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())
有人可以帮忙吗?我在这里错了吗?
答案 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