如何返回递延异步函数内延迟

问题描述 投票:1回答:1

下面我有科特林协同程序代码。 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

我使用的协同程序科特林版本kotlinx-coroutines-core:1.1.1

kotlin kotlinx.coroutines kotlin-coroutines
1个回答
1
投票

你需要指定一个范围:

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

这样一来,你的拉姆达里面,你将有一个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
© www.soinside.com 2019 - 2024. All rights reserved.