我有两个暂停功能:
suspend fun sendData() : Boolean
suspend fun awaitAcknowledge() : Boolean
我想将它们包装在第三个暂停function中,它们应该并行执行,我想通过同时返回两个值来计算最终结果:
suspend fun sendDataAndAwaitAcknowledge() : Boolean {
// TODO execute both in parallel and compare both results
}
但是,如果我这样写,
suspend fun sendDataAndAwaitAcknowledge() : Boolean {
val sendResult = sendData()
val receiveAck = awaitAcknowledge()
}
这些函数将按顺序执行,在我的情况下不起作用。
来自RxJava,我想实现类似zip
运算符的东西:
Single.zip(awaitAcknowledge(), sendData(), {receiveAck, sendResult -> ...})
我怎么能用Coroutines
做到这一点?
分析解答
您可以将awaitAll
用于此目的:
import kotlinx.coroutines.*
suspend fun sendDataAndAwaitAcknowledge() = coroutineScope {
awaitAll(async {
awaitAcknowledge()
}, async {
sendData()
})
}
fun sendData() = true
fun awaitAcknowledge() = false
fun main() {
runBlocking {
println(sendDataAndAwaitAcknowledge()) // [false, true]
}
}