Как ждать, пока все асинхронное закончится? - PullRequest
1 голос
/ 26 октября 2019

У меня есть список запросов, которые я хочу выполнить, и я хочу дождаться завершения всех из них, чтобы продолжить. Я использую сопрограммы kotlin с repeat и async, как показано ниже.

viewModelScope.launch(Dispatchers.IO) {
            repeat(serverAccountList.size) { 
                async { 
                    createHelloRequest(it)  // suspend function
                }
            }



            withContext(Dispatchers.Main) {
                _isLoading.value = false
            }
        }

Как я могу присоединиться к ним, чтобы я мог продолжить свой код в главном диспетчере?

Ответы [ 3 ]

0 голосов
/ 26 октября 2019

Не используйте Dispatchers.IO для вызова приостановленных (неблокирующих) функций. Весь ваш код может остаться на диспетчере Main. Кроме того, используйте от coroutineScope до launch столько подзадач, сколько вам нужно, и Kotlin позаботится о том, чтобы все были завершены до завершения вызова coroutineScope.

Все вместе, ваш код должен выглядеть следующим образом:

viewModelScope.launch {
    _isLoading.value = true
    coroutineScope {
        repeat(serverAccountList.size) {
            launch { createHelloRequest(it) }
        }
    }
    _isLoading.value = false
}
0 голосов
/ 27 октября 2019

    val jobs = mutableListOf<Job>()

    viewModelScope.launch(Dispatchers.IO) {
        repeat(serverAccountList.size) { 
            // save all job handles to mutable variable
            jobs += async { createHelloRequest(it) }
        }

        // await on all jobs
        jobs.awaitAll()   

        withContext(Dispatchers.Main) {
            _isLoading.value = false
        }
    }

0 голосов
/ 26 октября 2019

Вам нужно позвонить await для вашей асинхронности - например,

...

val stuff = async {...}
stuff.await()
...
...