将 Kotlin 挂起函数转换为返回 Mono 的函数的正确方法是什么?

diz*_*iaq 6 suspend kotlin project-reactor kotlin-coroutines

假设我们有一个函数

suspend fun doSomething(value: Int): String {
    delay(1000L)
    return "abc_$value"
}
Run Code Online (Sandbox Code Playgroud)

如何将其转换为返回的函数Mono?在属于协程范围的线程和反应器事件循环线程之间切换是否存在任何隐藏问题?

fun resultAsMono(fn: suspend (Int) -> String): (Int) -> Mono<String> {
   // ???
}
Run Code Online (Sandbox Code Playgroud)

那么效果会是这样的:

val newFn = resultAsMono(::doSomething)

val result = newFn(5).block()

assertThat(result).isEqualTo("abc_5")
Run Code Online (Sandbox Code Playgroud)

Mar*_*nyi 9

已经存在用于此转换的函数。你需要这种依赖...

<dependency>
    <groupId>org.jetbrains.kotlinx</groupId>
    <artifactId>kotlinx-coroutines-reactor</artifactId>
    <version>1.6.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

...然后您可以执行以下操作:

import kotlinx.coroutines.delay
import kotlinx.coroutines.reactor.mono

fun main() {
    val mono = mono { doSomething(5) }
    val result = mono.block()
    println(result)
}

suspend fun doSomething(value: Int): String {
    delay(1000L)
    return "abc_$value"
}
Run Code Online (Sandbox Code Playgroud)

就线程而言,您无需担心。Reactor 与并发无关,因此它可以很好地与 Kotlin 协程线程配合使用。