kotlin 协程是否具有带定时器的异步调用?
Does kotlin coroutines have async call with timer?
Kotlin 是否有可能在一段时间内在协程中调用函数 async(), 时间完成后会 return 默认结果?
我发现可以只调用 await,而不是无限等待结果。
async {
...
val result = computation.await()
...
}
但实际生产案例比您需要 return 默认结果或异常。在 Kotlin 协程中做某事的正确方法是什么?喜欢类似这样的东西:
async {
...
val timeout = 100500
val result: SomeDeferredClass = computation.await(timeout)
if (result.isTimeout()) {
// get default value
} else {
// process result
}
...
}
您可以使用 withTimeout
功能。它会在超时时抛出 CancellationException
。您可以捕获此异常并 return 您的默认值。
像这样:
async {
...
val timeout = 100500L
try {
withTimeout(timeout) {
computation.await()
}
...
} catch (ex: CancellationException) {
defaultValue
}
}
您还可以使用 withTimeoutOrNull
函数,在超时时 returns null
。像这样:
async {
...
val timeout = 100500L
withTimeoutOrNull(timeout) { computation.await() } ?: defaultValue
}
这种方法不会让您区分超时和 return 为空的计算。在这两种情况下,默认值都是 returned。
有关详细信息,请参阅此处:https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md#timeout
结合 Extensions 和@marstran 解决方案,我找到了一个解决方案,它可能更适合您的 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)
}
Kotlin 是否有可能在一段时间内在协程中调用函数 async(), 时间完成后会 return 默认结果?
我发现可以只调用 await,而不是无限等待结果。
async {
...
val result = computation.await()
...
}
但实际生产案例比您需要 return 默认结果或异常。在 Kotlin 协程中做某事的正确方法是什么?喜欢类似这样的东西:
async {
...
val timeout = 100500
val result: SomeDeferredClass = computation.await(timeout)
if (result.isTimeout()) {
// get default value
} else {
// process result
}
...
}
您可以使用 withTimeout
功能。它会在超时时抛出 CancellationException
。您可以捕获此异常并 return 您的默认值。
像这样:
async {
...
val timeout = 100500L
try {
withTimeout(timeout) {
computation.await()
}
...
} catch (ex: CancellationException) {
defaultValue
}
}
您还可以使用 withTimeoutOrNull
函数,在超时时 returns null
。像这样:
async {
...
val timeout = 100500L
withTimeoutOrNull(timeout) { computation.await() } ?: defaultValue
}
这种方法不会让您区分超时和 return 为空的计算。在这两种情况下,默认值都是 returned。
有关详细信息,请参阅此处:https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md#timeout
结合 Extensions 和@marstran 解决方案,我找到了一个解决方案,它可能更适合您的 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)
}