private val coroutineSupervisor = SupervisorJob()
protected val dispatcherProvider = CoroutineDispatcherProvider()
protected val viewModelScope = CoroutineScope(dispatcherProvider.main + coroutineSupervisor)
class CoroutineDispatcherProvider {
val main: CoroutineDispatcher
get() = Dispatchers.Main
val background: CoroutineDispatcher
get() = Dispatchers.IO
}
viewModelScope.launch {
...
runBlocking {
async { firstNumber() }.await()
async { secondNumber() }.await()
async { test() }.await()
async { thirdNumber() }.await()
}
}
suspend fun firstNumber(): Int {
delay(3_000) // 3 seconds delay
return 5
}
suspend fun secondNumber(): Int {
delay(5_000) // 5 seconds delay
return 8
}
suspend fun thirdNumber(): Int {
delay(7_000) // 7 seconds delay
return 10
}
suspend fun test() {
withContext(dispatcherProvider.background) {
...
}
}
Начал изучать сопрограммы несколько дней назад, и я увидел что-то странное.Функции firstNumber, secondNumber и thirdNumber выполняются как следует - задержка завершается, а затем выполняется следующая функция - в правильной последовательности, а test () - нет.Это возвращает значение намного позже, и runBlocking уже сделан, когда это произойдет.Я хотел бы убедиться, что он получит результат, а затем каким-то образом использовать его в другом запросе.Это потому, что я там использую какой-то неправильный диспетчер или как?