【问题标题】:Transform Mono<Void> in Mono<String> adding a value在 Mono<String> 中转换 Mono<Void> 添加一个值
【发布时间】:2019-12-17 10:32:52
【问题描述】:

我的程序服务提供了一些返回Mono&lt;Void&gt;的删除方法,例如:fun delete(clientId: String) : Mono&lt;Void&gt;

调用.delete("x")后我想将clientId传播到下游做其他操作:

userService.get(id).map{ user -> 
        userService.delete(user.id) //This returns Mono<Void>
    .map { 
        user.id //Never called!!!
    }
    .map { userId -> 
        //other calls using the propagated userId
    }
}

问题是因为删除返回一个Mono&lt;Void&gt;,下面的.map { user.id } 永远不会被调用。那么如何将Mono&lt;Void&gt; 转换为Mono&lt;String&gt; 来传播userId?

【问题讨论】:

    标签: reactive-programming spring-webflux project-reactor


    【解决方案1】:

    你可以使用thenReturn操作符:

    userService.get(id)
            .flatMap { user -> userService.delete(user.id).thenReturn(user.id) }
            .flatMap { id -> //other calls using the propagated userId }
    

    【讨论】:

      【解决方案2】:

      我设法使用 hasNext 将其转换为布尔值:

          @Test
          fun `should`() {
              val mono: Mono<String> = "1".toMono()
                      .flatMap { id ->
                          val map = Mono.empty<Void>()
                                  .hasElement()
                                  .map {
                                      id + "a"
                                  }.map {
                                      (it + "1")
                                  }
                          map
                      }
      
      
              mono.doOnNext {
                  println(mono)
              }.subscribe()
          }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 2022-01-11
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多