【问题标题】:Issue with Project Reactor's or() operator usageProject Reactor 的 or() 运算符使用问题
【发布时间】:2019-09-06 16:18:09
【问题描述】:

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

这是我的Monos 链:第一个是空的,第二个应该发出“hello”。

@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())

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

【问题讨论】:

    标签: reactive-programming project-reactor


    【解决方案1】:

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

    如果您改为执行 Mono.&lt;String&gt;empty().delaySubscription(Duration.ofMillis(100)).or(Mono.just("hello")); 之类的操作,您可以看到此行为,这几乎肯定会通过(因为 emtpy MonoonComplete() 结果被延迟到足以让另一个 Mono 先发出项目.)

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

    @Test
    public void orTest() {
        Mono<String> chain = Mono.<String>empty().switchIfEmpty(Mono.just("hello"));
    
        StepVerifier.create(chain)
                .expectNext("hello")
                .verifyComplete();
    }
    

    【讨论】:

    • 这是官方文档中的错字吗?它提到了一个结果,而不是一个信号。请参阅:从这个单声道或其他单声道发出第一个可用结果
    • 感谢您提供如此清晰的解释!我现在清楚多了。
    • @balteo 不,是我混淆了措辞-对此感到抱歉。现已修复。
    • 嗯... signalresult 的同义词吗?
    • 太棒了。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    相关资源
    最近更新 更多