如何在返回Deferred <t>的异步函数中延迟

时间:2019-02-06 21:19:58

标签: kotlin kotlinx.coroutines kotlin-coroutines

我有以下Kotlin协程代码。 doWorkAsync是正常(非挂起)功能,它返回Deferred<Int>

import kotlinx.coroutines.*

fun main() = runBlocking {
    val result = doWorkAsync("Hello ")
}

fun doWorkAsync(msg: String): Deferred<Int>  = async {
    log("$msg - Working")
    delay(500)
    log("$msg - Work Done")
    return@async 42
}

fun log(msg: String ) {
    println("$msg in ${ Thread.currentThread().name }")
}

我不知道如何在delay函数中使用doWorkAsync

我正在使用Kotlin协程版本kotlinx-coroutines-core:1.1.1

1 个答案:

答案 0 :(得分:1)

您需要指定一个范围:

fun doWorkAsync(msg: String) = GlobalScope.async {
    log("$msg - Working")
    delay(500)
    log("$msg - Work Done")
    return@async 42
}

这样,在lambda中,您将拥有一个CoroutineScope

注意:由于您使用的是表达式主体,因此无需显式指定返回类型Deferred<Int>。可以推断出来。


使用暂停功能的更灵活的解决方案

但是有更好的方法。我的意思是在这种情况下,该功能应该是异步的。但是,如果您想要一个可以被异步和顺序调用的函数呢?

这就是挂起功能发挥作用的地方。您可以这样定义函数:

suspend fun doWork(): Int {
    // ...
    delay(500)
    // ...
    return 42
}

然后您可以在呼叫站点决定如何使用它:

val d: Deferred<Int> = GlobalScope.async { doWork() } // asnyc
val i: Int = runBlocking { doWork() } // sequential
相关问题