【问题标题】:return Mono/Flux with 2 nested subscriptions使用 2 个嵌套订阅返回 Mono/Flux
【发布时间】:2020-05-09 11:51:31
【问题描述】:

我需要为一个函数返回 Mono / Flux,但这有 2 个嵌套订阅。我正在寻找一个更好的解决方案,仅在这 2 个订阅值可用之后发布 Mono/Flux,然后执行一些操作以获取 finalValue。

最终的目标是,函数 getFinalValue() 的订阅者应该能够订阅最终值。我对 Flux 也有类似的需求。最好的方法应该是什么?

fun <T> getFinalValue(): Mono<T> {

    object1.getValue1().subscribe { value1 ->

        object2.getValue2(value1.id).subscribe{ value2 -> 

        // perform some operation with value 1 and 2
        // derieve finalValue
       }
   } 

 return //I need to return Mono<T> which should publish finalValue to the subscribers of this function. 

}

【问题讨论】:

    标签: reactive-programming spring-reactive spring-reactor spring-kotlin


    【解决方案1】:

    您可以使用 .cache() 来存储 value1 并继续使用 Mono.zip。 然后在zipflatMap 中你有value1value2 的元组

    fun <T> getFinalValue(): Mono<T> {
        val value1 = object1.getValue1().cache();
        val value2 = object1.getValue1().flatMap(value -> object2.getValue2(value));
    
        return Mono.zip(value1, value2)
                .flatMap(tuple -> {
            // logic with tuple.T1 and tuple.T2
        })
    }
    

    【讨论】:

      【解决方案2】:

      你想做吗?

      fun <T> getFinalValue(): Mono<T> {
      
          return object1.getValue1()
              .flatMap { value1 ->
      
                  object2.getValue2(value1.id)
                      .map { value2 ->
                          // perform some operation with value 1 and 2
                          // derieve finalValue
                      }
              }
      }
      
      

      【讨论】:

      • 如果 getvalue1、getValue2 和 finalValue 都是 Mono 或者都是 Flux,这可以正常工作。如果它是混合的,那么它就会变得困难。虽然这可行,但@mslowiak 建议的解决方案听起来相对更好。无论如何,感谢您的宝贵时间!
      猜你喜欢
      • 2022-10-01
      • 2020-08-28
      • 1970-01-01
      • 2021-10-10
      • 2020-02-13
      • 2017-09-14
      • 1970-01-01
      • 2020-10-17
      • 2020-10-28
      相关资源
      最近更新 更多