【问题标题】:How to delay within async function that returns Deferred<T>如何在返回 Deferred<T> 的异步函数中延迟
【发布时间】:2019-02-06 21:19:57
【问题描述】:

我有以下 kotlin 协程代码。 doWorkAsync 是正常(非挂起)函数,它返回Deferred&lt;Int&gt;

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

【问题讨论】:

    标签: kotlin kotlinx.coroutines kotlin-coroutines


    【解决方案1】:

    你需要指定一个范围:

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

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

    注意:由于您使用的是表达式主体,因此您无需明确指定返回类型Deferred&lt;Int&gt;。可以推断。


    使用暂停函数的更灵活的解决方案

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

    这就是暂停功能发挥作用的地方。你这样定义你的函数:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-11
      • 2018-09-26
      • 2016-10-29
      • 2018-06-13
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      相关资源
      最近更新 更多