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 } ... }
你可以使用withTimeout
function。 它超时后会抛出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解决方案,我来到一个解决方案,可以更好地适应您的要求有超时和默认值的await
function。 另外我认为这是一个更清洁的解决方案
只需定义扩展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) }
- 匕首2错误:依赖“不能提供没有@Inject构造函数”
- 当Kotlin函数不采用可空类型时,正确的方法是什么?
- 当传递的泛型扩展某些东西时,RxJava中compose和ObservableTransformer的奇怪行为
- 如何在kotlin中扩展Java静态字段
- Kotlin – 高阶函数和类型不匹配
- 在Kotlin中使用Android Volley进行String请求时获取java.lang.VerifyError
- Android w / Kotlin纯java-Junit的NoClassDefFoundError解决方法不起作用
- Java通配符类型与Kotlin Star-projection
- 数据和开放不兼容,我有哪些替代方案?