我正在尝试编写一个函数,该函数异步运行2个操作,并使用Kotlin协程返回结果。例如,我希望我的getData
方法大致同时运行我的两个longRunningOperationX
方法,以便更快地获得合并结果:
fun getData(): String {
val stringOne = longRunningStringOperationOne()
val stringTwo = longRunningStringOperationTwo()
return stringOne + stringTwo
}
在Kotlin中,我可以使用launch
和async
方法运行这些操作。
fun getData(): String {
GlobalScope.launch {
val stringOne = async { longRunningStringOperationOne() }
val stringTwo = async { longRunningStringOperationTwo() }
println("result: $stringOne + $stringTwo")
// return "result: $stringOne + $stringTwo" <- not allowed
}
return "?"
}
但是,您可能知道,在GlobalScope
之外无法访问Coroutine范围内的操作结果,因此,我的方法只需要返回当时的内容即可,运行操作完成。
因此,在存在此问题的情况下-返回结果的非暂停功能(不是kotlin suspend fun
)-我如何才能异步(并行)运行两个长时间运行的操作,但要等到它们的结果之后才能运行返回使用Kotlin协程?
答案 0 :(得分:2)
您将要使用Structured Concurrency代替Global Scope,并使用await()
返回的async
作业。一种方法是这样的:
fun getData(): String {
return runBlocking {
val stringOne = async { longRunningStringOperationOne() }
val stringTwo = async { longRunningStringOperationTwo() }
"result: ${stringOne.await()} + ${stringTwo.await()}") // will be the return value of the runBlocking lambda
}
}