如何在 returns Deferred<T> 的异步函数中延迟
How to delay within async function that returns Deferred<T>
我有以下 kotlin 协程代码。 doWorkAsync
是正常(非挂起)功能,它 returns 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 }")
}
我不知道如何在 doWorkAsync
函数中使用 delay
。
我正在使用 kotlin 协程版本 kotlinx-coroutines-core:1.1.1
。
您需要指定范围:
fun doWorkAsync(msg: String) = GlobalScope.async {
log("$msg - Working")
delay(500)
log("$msg - Work Done")
return@async 42
}
这样,在你的 lambda 表达式中,你将有一个 CoroutineScope
。
注意:由于您使用的是表达式主体,因此无需明确指定 return 类型 Deferred<Int>
。可以推断。
使用挂起函数的更灵活的解决方案
但还有更好的方法。我的意思是在这种情况下,该函数显然应该是异步的。但是如果你想要一个可以异步和顺序调用的函数呢?
这就是挂起函数发挥作用的地方。你这样定义你的函数:
suspend fun doWork(): Int {
// ...
delay(500)
// ...
return 42
}
然后您可以在调用站点决定如何使用它:
val d: Deferred<Int> = GlobalScope.async { doWork() } // asnyc
val i: Int = runBlocking { doWork() } // sequential
我有以下 kotlin 协程代码。 doWorkAsync
是正常(非挂起)功能,它 returns 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 }")
}
我不知道如何在 doWorkAsync
函数中使用 delay
。
我正在使用 kotlin 协程版本 kotlinx-coroutines-core:1.1.1
。
您需要指定范围:
fun doWorkAsync(msg: String) = GlobalScope.async {
log("$msg - Working")
delay(500)
log("$msg - Work Done")
return@async 42
}
这样,在你的 lambda 表达式中,你将有一个 CoroutineScope
。
注意:由于您使用的是表达式主体,因此无需明确指定 return 类型 Deferred<Int>
。可以推断。
使用挂起函数的更灵活的解决方案
但还有更好的方法。我的意思是在这种情况下,该函数显然应该是异步的。但是如果你想要一个可以异步和顺序调用的函数呢?
这就是挂起函数发挥作用的地方。你这样定义你的函数:
suspend fun doWork(): Int {
// ...
delay(500)
// ...
return 42
}
然后您可以在调用站点决定如何使用它:
val d: Deferred<Int> = GlobalScope.async { doWork() } // asnyc
val i: Int = runBlocking { doWork() } // sequential