Kotlin:为什么你可以在 promise 列表上调用 awaitAll?

Mis*_*ith 0 kotlin kotlin-coroutines

让我们看看这段代码:

import kotlinx.coroutines.*

fun main() = runBlocking {
    val deferreds: List<Deferred<Int>> = (1..3).map {
        async {
            delay(50L * it)
            it
        }
    }
    val sum = awaitAll(deferreds[0], deferreds[1], deferreds[2]).sum()
    println("$sum")
}
Run Code Online (Sandbox Code Playgroud)

上面我们awaitAll用可变参数调用。这是源代码的awaitAll样子:

public suspend fun <T> awaitAll(vararg deferreds: Deferred<T>): List<T> =
    if (deferreds.isEmpty()) emptyList() else AwaitAll(deferreds).await()
Run Code Online (Sandbox Code Playgroud)

但显然我们也可以调用awaitAllPromise 列表:

import kotlinx.coroutines.*

fun main() = runBlocking {
    val deferreds: List<Deferred<Int>> = (1..3).map {
        async {
            delay(50L * it)
            it
        }
    }
    val sum2 = deferreds.awaitAll().sum()
    println("$sum2")
}
Run Code Online (Sandbox Code Playgroud)

如果awaitAll不是扩展功能,这怎么可能?

Jit*_*ite 5

查看kotlinx.coroutines.awaitAll它的源代码,该awaitAll方法既是全局函数又是Collection<Deferred<T>>模板类的扩展方法。

两者都应该工作得一样好并且基本上做相同的事情,这取决于您使用您喜欢的并且最适合您的标准的那个!

  • 我不敢相信这个方法一直就在我眼前!我太专注于另一件事了。 (2认同)