当前位置: 首页 > 知识库问答 >
问题:

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

国跃
2023-03-14

我有下面的科特林协程代码。< code>doWorkAsync是正常(非挂起)函数,它返回< code>Deferred

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 }")
}

我不知道如何在< code>doWorkAsync函数中使用< code>delay。

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

共有1个答案

暨鹭洋
2023-03-14

您需要指定一个范围:

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

这样,在您的lambda中,您将有一个<code>协程作用域。

注意:由于使用的是表达式体,所以不需要指定返回类型< code>Deferred

使用挂起函数的更灵活的解决方案

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

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

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

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

val d: Deferred<Int> = GlobalScope.async { doWork() } // asnyc
val i: Int = runBlocking { doWork() } // sequential
 类似资料:
  • 问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做

  • 问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做

  • 更新 我已经读了十几篇关于这个话题的文章,但没有一篇涉及到这个基本问题。我将在本文末尾列出一个参考资料部分。 原始帖子 我对函数的理解是,它返回一个promise。 MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function 在我的程序中,我可以编写如下内容: 我

  • 问题内容: 在SO中多次问过这个问题。但是我还是收不到东西。 我想从回调中获得一些价值。请看下面的脚本进行澄清。 如果我尝试返回该值,则只是“未定义”。我遵循了SO的一些想法,但仍然失败。 那些是: 问题答案: 这是不可能的,因为您无法从同步方法内部的异步调用返回。 在这种情况下,您需要将回调传递给foo,该回调将接收返回值 问题是,如果内部函数调用是异步的,则所有“包装”此调用的函数也必须是异步

  • 问题内容: 就像一个人在这里问到但他的解决方案是调用其他函数 …我想知道是否有可能拥有一个不调用a的函数第二个功能基于异步请求的响应,但仅当异步请求响应时。 可能是这样的: 不调用另一个函数,这有可能吗? 我要实现的目标是拥有一个可以用一些参数调用的函数,该函数将返回异步Web服务(如FB)的响应。 问题答案: 简而言之,没有。您不能让异步函数同步返回有意义的值,因为该值当时不存在(因为它是在后台

  • 问题内容: 我正在使用nodejs通过Mongoose从Mongodb查询数据。获取数据后,我想对该数据做一些处理,然后再将其响应给客户端。但是我无法获得返回值。在Google上浏览后,我了解到Node.js函数是异步javascript函数(非I / O阻止)。我尝试了这个Tut( 问题答案: 获得未定义值的原因是因为find函数是异步的,并且可以随时完成。在您的情况下,使用后就结束了,因此在访