Вы можете взять свою отложенную работу в переменной и затем ждать ее на вашем Главном диспетчере , как показано ниже:
try {
//Rather than await here, you take your Job as Deffered
val request: Deferred? = RestClient.instance.getItems()
withContext(Dispatchers.Main) {
//Yes, you can await here because it's non-blocking call and can be safely obtained from here once completed
val result = request?.await()
if (request.isSuccessful) {
//asign items to ViewModel
} else {
//asign error to ViewModel
}
}
} catch (e: Exception) {
withContext(Dispatchers.Main) {
//asign error to ViewModel
}
}
Какой официальный документ указывает на await()
:
Ожидает завершения этого значения без блокировки потока и возобновляет работу после завершения отложенного вычисления, возвращая результирующее значение или выдает соответствующее исключение , если отсроченное было отменено.
Эта функция приостановки отменяется.Если задание текущей сопрограммы отменяется или завершается во время ожидания этой функции приостановки, эта функция немедленно возобновляется с помощью CancellationException.
Эта функция может использоваться в вызове select с предложением onAwait.Используйте isCompleted для проверки завершения этого отложенного значения без ожидания.