在 Mono<String> 中转换 Mono<Void> 添加一个值

Posted

技术标签:

【中文标题】在 Mono<String> 中转换 Mono<Void> 添加一个值【英文标题】:Transform Mono<Void> in Mono<String> adding a value 【发布时间】: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?

【问题讨论】:

【参考方案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()
    

【讨论】:

小心,Reactor 文档说hasElement() 在实际的 Mono 之前发出并完成,所以如果你想在完成时做一些事情,效果可能会改变:projectreactor.io/docs/core/release/api/reactor/core/publisher/…

以上是关于在 Mono<String> 中转换 Mono<Void> 添加一个值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Webflux 中返回 Mono<Map<String, Flux<Integer>>> 响应?

如何在反应式 Java 中从 Mono<String> 获取字符串

无法从 Flux<PortCall> 转换为 Mono<?扩展对象>

是否可以并行启动 Mono 并汇总结果

如何从 Spring Flux 平面图操作中返回对象

如何在 Reactor 中使用 Mono 的内容