【问题标题】:Mono switchIfEmpty() is always executed单声道 switchIfEmpty() 总是被执行
【发布时间】:2021-05-02 19:23:38
【问题描述】:

我想做这样的事情:

if (someObject == null) {
    return Mono.just(someId)
      .flatMap(si -> service.monoVoidMethod(si));
}
return Mono.just(someObject)
        .flatMap(so -> service.monoObjectMethod(so)
             .flatMap(so2 -> service.monoVoidMethod2(so2)))

如果没有 if 语句,还有什么方法可以以更“反应性”的方式来做?我已经尝试过使用 Mono.switchIfEmpty,但是当 someObject 不为空时,monoVoidMethod 和 monoVoidMethod2 都被调用了。

return Mono.justOrEmpty(someObject)
   .flatMap(so -> service.monoObjectMethod(so)
             .flatMap(so2 -> service.monoVoidMethod2(so2)))
   .switchIfEmpty(Mono.empty().flatMap(var -> service.monoVoidMethod(si)))
     

我发现了一个孪生话题:Mono switchIfEmpty() is always called

也尝试了 Mono.defer,但没有任何改变:

return Mono.justOrEmpty(someObject)
   .flatMap(so -> service.monoObjectMethod(so)
             .flatMap(so2 -> service.monoVoidMethod2(so2)))
   .switchIfEmpty(Mono.defer(() -> service.monoVoidMethod(si)))

当 monoVoidMethod2 和 monoVoidMethod1 不是 Void 类型时,一切都运行良好——但这不是我的情况。在我的系统中,monoVoidMethod2 和 monoVoidMethod1 返回带有空正文的 http 状态。

【问题讨论】:

    标签: java spring spring-webflux project-reactor


    【解决方案1】:

    您的示例没有错误。给你

       public void test(Integer integer) {
            Mono.justOrEmpty(integer)
                    .flatMap(so -> Mono.just(1)
                             .flatMap(so2 -> Mono.just(3)))
                    .switchIfEmpty(Mono.just(10))
                    .subscribe(System.out::println);
        }
    

    如果您执行test(1),那么它将打印 3。另外,执行test(null) 会返回一个10 - switchIfEmpty 值。

    --- 更新于 30.01.2021

    我被改变了测试。 flatMap for so2 返回一个空的 Mono。所以,test(1)test(null) 的调用都返回 10

    public void test(Integer integer) {
       Mono.justOrEmpty(integer)
          .flatMap(so -> Mono.just(1)
             .flatMap(so2 -> Mono.empty()))
          .switchIfEmpty(Mono.just(10))
          .subscribe(System.out::println);
    }
    

    【讨论】:

    • 那是因为你的例子有点不同。 U 返回 Mono.just(3) [Mono],而不是 Mono 尝试与我的完全相同
    • @kigeb63101 在您的示例中,so2 的 flatMap 返回带有空正文的响应,它会触发 onNext 信号。但是,switchIfEmpty 在收到 onComplete 信号时会起作用。
    • @kigeb63101 您需要将您的flatMap(so2 -> service.monoVoidMethod2(so2))) 更改为flatMap(so2 -> service.monoVoidMethod2(so2)).then())。之后switchIfEmpty 将被调用
    • 我也试过了。即使使用 then() 如果我的对象不为 null,也会执行 monoVoidMethod2 和 switchIfEmpty。
    猜你喜欢
    • 2019-06-19
    • 2020-08-07
    • 2020-06-05
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多