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

What is the correct way to convert a Kotlin suspend function to a function returning Mono?

假设我们有一个函数

suspend fun doSomething(value: Int): String {
    delay(1000L)
    return "abc_$value"
}

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

fun resultAsMono(fn: suspend (Int) -> String): (Int) -> Mono<String> {
   // ???
}

所以效果是这样的:

val newFn = resultAsMono(::doSomething)

val result = newFn(5).block()

assertThat(result).isEqualTo("abc_5")

此转换的函数已存在。你需要这个依赖...

<dependency>
    <groupId>org.jetbrains.kotlinx</groupId>
    <artifactId>kotlinx-coroutines-reactor</artifactId>
    <version>1.6.0</version>
</dependency>

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

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"
}

在线程方面,您无需担心。 Reactor 与并发无关,因此它可以很好地与 Kotlin 协程线程一起工作。