2017-06-29 119 views
4

Kotlin有没有可能在一段时间内调用函数async(),女巫会在时间结束后返回默认结果?kotlin协同程序是否使用定时器进行异步调用?

我发现可以只调用await,并且比无限等待结果。

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 
     } 
     ... 
} 

回答

6

您可以使用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

+0

需要的究竟是什么,谢谢! – kurt

1

结合两者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) 
}