Сопрограммы Kotlin получают результаты от запуска - PullRequest
0 голосов
/ 01 февраля 2019

Я новичок в kotlin и его концепции сопрограммы.

У меня ниже сопрограммы с использованием withTimeoutOrNull -

    import kotlinx.coroutines.*

    fun main() = runBlocking {

        val result = withTimeoutOrNull(1300L) {
            repeat(1) { i ->
                println("I'm with id $i sleeping for 500 ms ...")
                delay(500L)
            }
            "Done" // will get cancelled before it produces this result
        }
        println("Result is $result")
    }

Вывод -

    I'm sleeping 0 ...
    Result is Done

У меня есть другаяПрограмма сопрограммы без таймаута -

    import kotlinx.coroutines.*

    fun main() = runBlocking {
        val result = launch {
            repeat(1) { i ->
                println("I'm sleeping $i ...")
                delay(500L)
            }
            "Done" // will get cancelled before it produces this result
        }

        result.join()
        println("result of coroutine is ${result}")
    }

output -

    I'm sleeping 0 ...
    result of coroutine is StandaloneCoroutine{Completed}@61e717c2

Как получить результат вычисления в сопрограмме kotlin, если я не использую withTimeoutOrNull, как моя вторая программа.

1 Ответ

0 голосов
/ 01 февраля 2019

launch ничего не возвращает, поэтому вам необходимо:

  1. Использовать async и await (в этом случае await возвращает значение)

    import kotlinx.coroutines.*
    
    fun main() = runBlocking {
        val asyncResult = async {
            repeat(1) { i ->
                println("I'm sleeping $i ...")
                delay(500L)
            }
            "Done" // will get cancelled before it produces this result
        }
    
        val result = asyncResult.await()
        println("result of coroutine is ${result}")
    }
    
  2. Не использовать запуск вообще или переместить ваш код, находящийся внутри запуска, в функцию приостановки и использовать результат этой функции:

    import kotlinx.coroutines.*
    
    fun main() = runBlocking {
        val result = done()
        println("result of coroutine is ${result}")
    }
    
    suspend fun done(): String {
        repeat(1) { i ->
            println("I'm sleeping $i ...")
            delay(500L)
        }
        return "Done" // will get cancelled before it produces this result
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...