Доступ к значениям за пределами области сопрограммы в Kotlin

Я получил этот код прямо здесь, он отлично работает. Я могу распечатать значения, которые получаю от каждого задания / сопрограмм, запускаемых в области видимости. Но проблема в том, что мне сложно использовать значения за пределами области видимости. Два задания выполняются асинхронно и возвращают список из конечной точки. Как я могу вернуть результат1 или результат2? Я пробовал использовать глобальные переменные, которые назначаются из задания, но оно возвращает null или пусто.

      private val ioScope = CoroutineScope(Dispatchers.IO + Job())

    fun getSomethingAsync(): String {
    
    ioScope.launch {
            val job = ArrayList<Job>()

            job.add(launch {
                println("Network Request 1...")
                val result1 = getWhatever1() ////I want to use this value outside the scope

            })
            job.add(launch {
                println("Network Request 2...")
                val result2 = getWhatever2() //I want to use this value outside the scope

            })
            job.joinAll()

        
    }
    //Return result1 and result2 //help 
}

1 ответ

Если вы хотите, чтобы функция ждала и завершилась, это означает, что вам нужно getSomethingAsync()не быть асинхронным. Сделай это suspendи удалить ioScope.launch().

Кроме того, если вы хотите getWhatever1()а также getWhatever2()для запуска асинхронно друг с другом и ожидания их результатов используйте async()вместо launch():

      suspend fun getSomething(): String = coroutineScope {
    val job1 = async {
        println("Network Request 1...")
        getWhatever1() ////I want to use this value outside the scope
    }

    val job2 = async {
        println("Network Request 2...")
        getWhatever2() //I want to use this value outside the scope
    }

    val result1 = job1.await()
    val result2 = job2.await()
    
    //Return result1 and result2 //help
}
Другие вопросы по тегам