并行执行协程并等待所有协程完成

Execute coroutines in pararell and wait for all to finish

我有一个对 API 执行不同请求的视图模型,我目前正在这样调用我的 API

        val call1 = repo.getCall1()
        val call2 = repo.getCall2()
        val call3 = repo.getCall3()
        val call4 = repo.getCall4()
        val call5 = repo.getCall5()
        val call6 = repo.getCall6()

这种方法的问题是我需要等待每个完成才能启动另一个,在我调用 repo(它们都是挂起函数)之后我通知 livedatas,但这需要有点长(4 - 5 秒),我想同时进行所有调用并在通知我的 livedata

之前立即捕获它们

我正在寻找这样的东西

myCoroutineScope.launch {

            call1 = repo.getCall1()
            call2 = repo.getCall2()
            call3 = repo.getCall3()
            call4 = repo.getCall4()
            call5 = repo.getCall5()
            call6 = repo.getCall6()
    }.awaitForAllToFinish()

我想使用 async - await 而不是 jobs

如果所有调用的结果都是同一类型,可以用listOfawaitAll来实现:

val results = listOf(
        async { repo.getCall1() }
        async { repo.getCall2() }
        async { repo.getCall3() }
        async { repo.getCall4() }
        async { repo.getCall5() }
        async { repo.getCall6() }
    ).awaitAll()

如果不是,我想您会希望为每个变量保留变量。请注意,与您的原始代码不同,这会并行运行它们。

val call1 = async { repo.getCall1() }
val call2 = //...

val result1 = call1.await()
val result2 = call2.await()
// ...

// use the results

或者按照您在第一条评论中建议的那样做,也许像这样(没有检查)。但是再一次,如果结果类型不完全相同,则不切实际。

val call1 = async { repo.getCall1() }
val call2 = //...

val jobs = listOf(call1, call2, call3, ...)
val resultsByJob = jobs.zip(jobs.awaitAll())

val result1 = resultsByJob[call1]!!