2017-06-29 24 views
4

コトリンはコルーチンの関数async()をしばらくの間呼び出す可能性がありますか?時間の完了後にデフォルト結果が返されますか?kotlinコルーチンはタイマーで非同期呼び出しをしていますか?

私はawaitだけを呼び出すことができ、無限大は結果を待つことができることがわかりました。

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

実際の制作の場合は、デフォルトの結果または例外のいずれかを返す必要があります。コトリンのコルーチンで何かをする適切な方法は何ですか?これと似たようなもの:

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

あなたはまた、タイムアウトにnullを返すwithTimeoutOrNull -functionを、使用することができます。このように:

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

は、私がタイムアウトし、デフォルト値を持つawait機能を有するの要件に良く合うことが解決策に来て両方Extensionsと@marstranソリューションを組み合わせます。

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) 
} 
関連する問題