Kotlin 协程等待 2 个或更多不同的并发请求
Kotlin coroutines await for 2 or more different concurrent requests
我在 android 中使用 kotlin 协程通过视图模型从服务器获取响应。
问题是我想获得两个不同的请求响应以更新 ui 但想同时执行它们并等待它们完成。然后用收到的所有结果更新 ui。
如果在每个请求后使用异步和等待,它将一个接一个地执行并且它不是并发的,如果使用请求映射和 awaitAll(),我无法处理多种数据类型(数据 类),因为数据类型两个请求是不同的。
可能不止两个请求。
对于这种情况我能做些什么?
val job = viewModelScope.launch {
val a = async { firstUseCase.execute() }.await()
val b = async { secondUseCase.execute() }.await()
}
你只需要开始每个请求,首先调用 async
以获得并发行为,然后 await
为所有这些请求,无论你是一个接一个地单独执行还是全部执行他们立即 awaitAll
.
个人:
viewModelScope.launch {
val a = async { firstUseCase.execute() }
val b = async { secondUseCase.execute() }
val resA = a.await()
val resB = b.await()
//Use results 'resA' and 'resB' here
}
或 awaitAll
:
viewModelScope.launch {
val a = async { firstUseCase.execute() }
val b = async { secondUseCase.execute() }
val (resA, resB) = awaitAll(a, b)
//Use results 'resA' and 'resB' here
}
您可以使用异步协程构建器和并行映射到 运行 动态 bg 并行工作并暂停进一步执行,直到所有结果可用 -
import kotlinx.coroutines.*
fun main() {
runBlocking<Unit>
{
val smoothie = prepareSmoothie()
println("prepareSmoothie | Smoothie prepared with: $smoothie")
}
}
private suspend fun addIngredient(index: Int, item: String): String {
println("prepareSmoothie | addIngredient: $item")
delay(index.times(3_000).toLong())
println("prepareSmoothie | addedIngredient: $item")
return "$item"
}
private suspend fun prepareSmoothie(): List<String> {
println("prepareSmoothie | Go On")
println("++++++++++++++++++++++")
return runBlocking {
listOf("Fruits", "Grains", "Flavor boosters", "Ice").mapIndexed { index, item ->
async {
addIngredient(index, item)
} .map { it.await() }
}
}
Result:
prepareSmoothie | Go On
++++++++++++++++++++++
prepareSmoothie | addIngredient: Fruits
prepareSmoothie | addIngredient: Grains
prepareSmoothie | addIngredient: Flavor boosters
prepareSmoothie | addIngredient: Ice
++++++++++++++++++++++
prepareSmoothie | addedIngredient: Fruits
prepareSmoothie | addedIngredient: Grains
prepareSmoothie | addedIngredient: Flavor boosters
prepareSmoothie | addedIngredient: Ice
++++++++++++++++++++++
prepareSmoothie | Smoothie prepared with: [Fruits, Grains, Flavor boosters, Ice]
我在 android 中使用 kotlin 协程通过视图模型从服务器获取响应。 问题是我想获得两个不同的请求响应以更新 ui 但想同时执行它们并等待它们完成。然后用收到的所有结果更新 ui。 如果在每个请求后使用异步和等待,它将一个接一个地执行并且它不是并发的,如果使用请求映射和 awaitAll(),我无法处理多种数据类型(数据 类),因为数据类型两个请求是不同的。 可能不止两个请求。 对于这种情况我能做些什么?
val job = viewModelScope.launch {
val a = async { firstUseCase.execute() }.await()
val b = async { secondUseCase.execute() }.await()
}
你只需要开始每个请求,首先调用 async
以获得并发行为,然后 await
为所有这些请求,无论你是一个接一个地单独执行还是全部执行他们立即 awaitAll
.
个人:
viewModelScope.launch {
val a = async { firstUseCase.execute() }
val b = async { secondUseCase.execute() }
val resA = a.await()
val resB = b.await()
//Use results 'resA' and 'resB' here
}
或 awaitAll
:
viewModelScope.launch {
val a = async { firstUseCase.execute() }
val b = async { secondUseCase.execute() }
val (resA, resB) = awaitAll(a, b)
//Use results 'resA' and 'resB' here
}
您可以使用异步协程构建器和并行映射到 运行 动态 bg 并行工作并暂停进一步执行,直到所有结果可用 -
import kotlinx.coroutines.*
fun main() {
runBlocking<Unit>
{
val smoothie = prepareSmoothie()
println("prepareSmoothie | Smoothie prepared with: $smoothie")
}
}
private suspend fun addIngredient(index: Int, item: String): String {
println("prepareSmoothie | addIngredient: $item")
delay(index.times(3_000).toLong())
println("prepareSmoothie | addedIngredient: $item")
return "$item"
}
private suspend fun prepareSmoothie(): List<String> {
println("prepareSmoothie | Go On")
println("++++++++++++++++++++++")
return runBlocking {
listOf("Fruits", "Grains", "Flavor boosters", "Ice").mapIndexed { index, item ->
async {
addIngredient(index, item)
} .map { it.await() }
}
}
Result:
prepareSmoothie | Go On
++++++++++++++++++++++
prepareSmoothie | addIngredient: Fruits
prepareSmoothie | addIngredient: Grains
prepareSmoothie | addIngredient: Flavor boosters
prepareSmoothie | addIngredient: Ice
++++++++++++++++++++++
prepareSmoothie | addedIngredient: Fruits
prepareSmoothie | addedIngredient: Grains
prepareSmoothie | addedIngredient: Flavor boosters
prepareSmoothie | addedIngredient: Ice
++++++++++++++++++++++
prepareSmoothie | Smoothie prepared with: [Fruits, Grains, Flavor boosters, Ice]