Digamos que tenemos una función
suspend fun doSomething(value: Int): String { delay(1000L) return "abc_$value" } ¿Cómo convertirlo en una función que devuelve Mono ? ¿Hay algún problema oculto al cambiar entre subprocesos que pertenecen al alcance de la rutina y subprocesos de bucle de eventos del reactor?
fun resultAsMono(fn: suspend (Int) -> String): (Int) -> Mono<String> { // ??? }Así que ese efecto sería así:
val newFn = resultAsMono(::doSomething) val result = newFn(5).block() assertThat(result).isEqualTo("abc_5")Ya existe una función para esta conversión. Necesitas esta dependencia...
<dependency> <groupId>org.jetbrains.kotlinx</groupId> <artifactId>kotlinx-coroutines-reactor</artifactId> <version>1.6.0</version> </dependency>... y luego puedes hacer lo siguiente:
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" }En términos de enhebrado, no tienes nada de qué preocuparte. Reactor es independiente de la concurrencia, por lo que puede funcionar perfectamente con los subprocesos de rutinas de Kotlin.