如何等待所有异步完成?
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
调度程序上。此外,根据需要使用 coroutineScope
到 launch
子任务,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
}
}
我有一个要执行的请求列表,我想等待所有请求完成才能继续。我正在使用带有重复和异步的 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
调度程序上。此外,根据需要使用 coroutineScope
到 launch
子任务,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
}
}