我有两个暂停功能:

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]
    }
}