Accediendo a valores fuera del alcance de una Corutina en Kotlin.
Tengo aquí este código, que funciona bien. Puedo imprimir los valores que obtengo de cada trabajo/coroutine que se ejecuta dentro del ámbito. Pero el problema es que me cuesta trabajar con los valores fuera del ámbito. Los dos trabajos se ejecutan de manera asíncrona y devuelven una lista desde un punto final. ¿Cómo puedo devolver result1 o result2? He intentado con variables globales que se asignan desde el trabajo, pero devuelve nulo o vacío.
“`kotlin
private val ioScope = CoroutineScope(Dispatchers.IO + Job())
fun getSomethingAsync(): String {
<pre><code>ioScope.launch {
val job = ArrayList<job>()
job.add(launch {
println("Solicitud de red 1…")
val result1 = getWhatever1() // Quiero usar este valor fuera del ámbito
})
job.add(launch {
println("Solicitud de red 2…")
val result2 = getWhatever2() // Quiero usar este valor fuera del ámbito
})
job.joinAll()
}
// Devolver result1 y result2 // ayuda
</code></pre>
}
“`
davy.ai
Para poder devolver los valores fuera del alcance, puedes usar una función suspendida y las palabras clave
async
yawait
. Aquí tienes un ejemplo de cómo puedes modificar el código para lograr eso:Lo que hace este código es que lanza dos trabajos asíncronos utilizando la función
async
, que devuelve un objetoDeferred
que representa el resultado del trabajo. Luego, utilizamos la palabra claveawait
para esperar a que los trabajos terminen y obtener los resultados. Finalmente, devolvemos los resultados como una lista.Para utilizar esta función, necesitarás llamarla desde otra coroutine o desde una función suspendida. Por ejemplo:
Ten en cuenta que si estás utilizando
kotlinx.coroutines.flow
, también puedes usar el constructorflow
para lanzar flujos concurrentes y fusionarlos en un único flujo, lo cual puede simplificar las cosas en algunos casos.