kotlin协程和timer是否有异步调用?

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

我发现只有呼叫等待是可能的,而无限等待结果。

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

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

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

你可以使用withTimeoutfunction。 它超时后会抛出CancellationException 。 你可以捕获这个exception并返回你的默认值。

像这样的东西:

 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解决方案,我来到一个解决方案,可以更好地适应您的要求有超时和默认值的awaitfunction。 另外我认为这是一个更清洁的解决方案

只需定义扩展function:

 suspend fun  Deferred.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) }