在 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<Void>
的删除方法,例如:fun delete(clientId: String) : Mono<Void>
调用.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<Void>
,下面的.map
user.id
永远不会被调用。那么如何将Mono<Void>
转换为Mono<String>
来传播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> 获取字符串