【问题标题】:Kotlin coroutines await for 2 or more different concurrent requestsKotlin 协程等待 2 个或更多不同的并发请求
【发布时间】:2020-11-07 22:58:47
【问题描述】:

我正在使用 kotlin 协程通过 viewmodel 从 android 中的服务器获取响应。 问题是我想获得两个不同的请求响应来更新 ui 但想同时执行它们并等待它们完成。然后使用收到的所有结果更新 ui。 如果在每个请求之后使用 async 和 await 它将一个一个地执行并且它不是并发的,如果使用请求的映射和 awaitAll(),我无法处理多个数据类型(数据类),因为两个请求的数据类型不同. 可能不止两个请求。 这种情况我该怎么办?

val job = viewModelScope.launch {

        val a = async { firstUseCase.execute() }.await()
        val b = async { secondUseCase.execute() }.await()
 }

【问题讨论】:

    标签: android kotlin kotlin-coroutines android-viewmodel


    【解决方案1】:

    您只需启动每个请求,首先调用async 以获得并发行为,然后为所有请求调用await,无论您是一个接一个地执行,还是使用@987654323 一次执行所有请求@。

    个人:

    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
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用异步协程构建器和并行映射来运行动态 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]
      

      【讨论】:

        猜你喜欢
        • 2020-08-12
        • 2022-01-18
        • 1970-01-01
        • 2018-11-01
        • 2020-09-29
        • 1970-01-01
        • 2020-02-22
        • 2019-02-21
        • 1970-01-01
        相关资源
        最近更新 更多