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

时间:2019-08-09 16:43:08

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

我的程序服务提供了一些返回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
    }
}

问题在于,由于delete返回一个Mono<Void>,因此从未调用以下.map { user.id }。那么如何将Mono<Void>转换成Mono<String>来传播userId?

2 个答案:

答案 0 :(得分:2)

您可以使用thenReturn运算符:

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

答案 1 :(得分:-1)

我设法使用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()
    }