协程作业返回值

时间:2020-09-03 21:54:13

标签: android kotlin kotlin-coroutines coroutine

我正在尝试用Kotlin Coroutines做这件事(这是伪代码):

suspend fun myFunction() {
  if (job.isActive) {
    job.join()
    return job.result
  } else {
    job.start()
    job.join()
    return job.result
  }
}

基本上,有一个执行一些代码并返回值的作业。然后函数使用该作业。如果作业未启动,它将执行该作业并返回其结果。如果作业已经开始,它将等待完成,然后返回结果。

但不确定如何处理此问题。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

class MyClass(override val coroutineContext: CoroutineContext) : CoroutineScope {
    private val lazyThing =
        async(start = CoroutineStart.LAZY) {
            5 // Calculate using suspending functions as necessary
        }

    suspend fun getThing() = lazyThing.await()
}

lazyThing最终是Deferred<Int>。在第一次调用getThing()之前,不会计算其内容。它只会被计算一次,然后立即返回其值。

答案 1 :(得分:0)

import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext


fun main() {
    println(myFunction())
}

fun myFunction(): Int = runBlocking {
    aJobAsync().await()
}

suspend fun aJobAsync(): Deferred<Int> = withContext(Dispatchers.Default) {// use Dispatchers.IO for IO intensive task
    async {
        2 + 2
    }
}

aJobAsync-这将返回延迟的内容,可用于检索作业的返回值

myFunction-是一个runBlocking块,这意味着在调用myFunction时,调用者线程将被阻止。由于我们需要协程范围来调用作业等待状态