并行执行协程并等待所有协程完成
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
如果所有调用的结果都是同一类型,可以用listOf
和awaitAll
来实现:
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]!!
我有一个对 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
如果所有调用的结果都是同一类型,可以用listOf
和awaitAll
来实现:
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]!!