У kotlin coroutines есть асинхронный вызов с таймером?

У Kotlin есть возможность вызывать функцию async () в сопрограмме с некоторым временем, ведьма вернет результат по умолчанию после завершения времени?

Я обнаружил, что можно только вызвать ожидание, а не бесконечность ждать результата.

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

Но реальный случай производства, чем вам нужно вернуть либо результат по умолчанию, либо исключение. Каков правильный способ сделать что-то в сопрограммах Котлина? Как что-то похожее на это:

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

Вы можете использовать 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

Объединив оба расширения и решение @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) } 
Intereting Posts
Ошибка сообщения IntelliJ об ошибке для файла, не найденного в модуле, который я создал Реализация интерфейса Java в Котлине поделиться текстом в студии android с помощью kotlin Как получить значение свойства с отражением RXJava – concat не работает Разбор json со сломанным удаленным API Фрагмент isDetached условный не запускается, хотя фрагмент, безусловно, отсоединен kotlin: синтаксис для 2 лямбда-параметра Kotlin: Интерфейс с неизменяемым свойством, реализуемым классом с изменчивым Какой из них лучший объект или верхняя функция в Котлине? Прочитайте текстовый объект (текстовый файл из папки с данными) в виде строки в Kotlin (Android) Цвет фона и перетасовка изображений в режиме прокрутки в recyclerView Android с помощью группового адаптера Kotlin Ошибки Runtime для базовых операторов Замена сбора потока в собственном решении Kotlin Цель камеры не работает: она входит в блок catch и говорит: «Не удалось создать файл!»