kotlin协同程序是否使用定时器进行异步调用?

Kotlin是否有可能在一段时间内调用函数async(),女巫会在时间结束后返回默认结果?

我发现只有呼叫等待才有可能,而且无限期等待结果。

async {
        ...
        val result = computation.await()
        ...
}

但真正的生产情况比你需要返回默认结果或异常。 在Kotlin协同程序中做什么是正确的方法? 像这样的东西:

async {
        ...
        val timeout = 100500
        val result: SomeDeferredClass = computation.await(timeout)
        if (result.isTimeout()) {
           // get default value
        } else {
           // process result
        }
        ...
}

您可以使用withTimeout功能。 它会在超时时抛出CancellationException 。 你可以捕获这个异常并返回你的默认值。

像这样的东西:

async {
    ...
    val timeout = 100500L

    try {
        withTimeout(timeout) {
            computation.await()
        }
        ...
    } catch (ex: CancellationException) {
        defaultValue
    }
}

你也可以使用withTimeoutOrNull函数,它在超时时返回null 。 喜欢这个:

async {
    ...
    val timeout = 100500L
    withTimeoutOrNull(timeout) { computation.await() } ?: defaultValue
}

这种方法不会让你区分超时和返回null的计算。 两种情况下都会返回默认值。

欲了解更多信息,请看这里:https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md#timeout


结合扩展和@marstran解决方案,我找到了一个解决方案,可以更好地满足您的具有timeout和default值的await函数的需求。 另外我认为这是一个更清洁的解决方案

只需定义扩展功能:

suspend fun <T> Deferred<T>.await(timeout : Long, defaultValue : T) =
    withTimeoutOrNull(timeout) { await() } ?: defaultValue

你可以在任何地方使用它。 代替

async {
    ...
    val timeout = 100500L
    withTimeoutOrNull(timeout) { computation.await() } ?: defaultValue
}

你可以简单地做

async {
    val timeout = 100500L
    computation.await(timeout, defaultValue)
}
链接地址: http://www.djcxy.com/p/53259.html

上一篇: Does kotlin coroutines have async call with timer?

下一篇: How to: fire and forget async coroutines in Kotlin