如何等待所有异步完成?

How to wait for all the async to finish?

我有一个要执行的请求列表,我想等待所有请求完成才能继续。我正在使用带有重复和异步的 kotlin 协程,如下所示。

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



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

我怎样才能加入他们,以便我可以在 Main Dispatcher 中继续我的代码?

您需要为异步调用 await - 例如

...

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

不要使用 Dispatchers.IO 调用可挂起(非阻塞)函数。您的所有代码都可以保留在 Main 调度程序上。此外,根据需要使用 coroutineScopelaunch 子任务,Kotlin 将确保在 coroutineScope 调用完成之前完成所有子任务。

全部放在一起,您的代码应该如下所示:

viewModelScope.launch {
    _isLoading.value = true
    coroutineScope {
        repeat(serverAccountList.size) {
            launch { createHelloRequest(it) }
        }
    }
    _isLoading.value = false
}

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