kotlin协程与定时器有异步调用吗?

kur*_*urt 6 coroutine kotlin

Kotlin是否有可能在一段时间内在协同程序中调用函数async(),在时间完成后会返回默认结果?

我发现只能调用await,而无限等待结果.

async {
        ...
        val result = computation.await()
        ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

mar*_*ran 12

你可以使用withTimeout-function.CancellationException当它超时时它会抛出一个.您可以捕获此异常并返回默认值.

像这样的东西:

async {
    ...
    val timeout = 100500L

    try {
        withTimeout(timeout) {
            computation.await()
        }
        ...
    } catch (ex: CancellationException) {
        defaultValue
    }
}
Run Code Online (Sandbox Code Playgroud)

你也可以使用withTimeoutOrNull-function,它null在超时时返回.像这样:

async {
    ...
    val timeout = 100500L
    withTimeoutOrNull(timeout) { computation.await() } ?: defaultValue
}
Run Code Online (Sandbox Code Playgroud)

这种方法不允许您区分超时和返回null的计算.在两种情况下都将返回默认值.

有关详细信息,请参阅此处:https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md#timeout