Kotlin 如何从函数调用Suspend函数

Kotlin 如何从函数调用Suspend函数,kotlin,kotlin-coroutines,suspend,Kotlin,Kotlin Coroutines,Suspend,我试图在另一个suspend函数的参数中调用一个suspend函数。编译器实际上不允许这样做。它告诉我必须从挂起函数或协同程序调用挂起函数 suspend fun compareElements( isReady: Boolean = isReady() // IDE complains. ) { ... } //This is for this questions purpose. Reality is a bit more complex. suspend fun isRea

我试图在另一个suspend函数的参数中调用一个suspend函数。编译器实际上不允许这样做。它告诉我必须从挂起函数或协同程序调用挂起函数

suspend fun compareElements(
    isReady: Boolean = isReady() // IDE complains.
) {
   ...
}

//This is for this questions purpose. Reality is a bit more complex.
suspend fun isReady() = true

我该怎么做?我需要在参数中包含
isReady()

我不认为编译器在抱怨您试图从另一个挂起函数调用挂起函数

错误的真正原因是您试图调用
suspend
函数作为默认参数值。kotlin不支持,也不应该支持

默认参数应该是在没有提供其他值时可用的值。如果将函数用作默认值,则与提供参数值的函数调用相比,在没有任何参数的情况下调用该函数时,它更有可能减慢执行速度

我建议您使用一个简单的常量值作为默认参数,而不是函数调用,更不用说挂起函数调用了。

如果确实需要使用
isReady
函数,则从函数
compareElements
中获取值,然后使用它


如果您需要任何帮助,请在注释中告诉我。

您可以将挂起函数作为默认参数传递:

suspend fun compareElements(
    readyCheck: suspend () -> Boolean = { isReady() }
) {
    if (readyCheck()) {
        ...
    }
}

基本上,协程是可以挂起而不阻塞线程的计算。为了继续类比,
await()
可以是一个挂起函数(因此也可以从
async{}
块中调用),它挂起一个协程,直到完成一些计算并返回其结果:

async{//这里我称之为外部异步协程
...
//这里我称计算为内部协同程序
val结果=计算。等待()
...
}
我们看到在计算中调用了wait,所以返回Deferred的可能是异步的,这意味着它可以启动另一个协同路由

fun computation():延迟{
异步返回{
真的
}
}
suspend是否意味着当外部异步协程等待(等待)内部计算协程完成时,它(外部异步协程)将空闲(因此命名为suspend)并将线程返回到线程池,当子计算协程完成时,它(外部异步协程)将被唤醒,从池中获取另一个线程并继续?当协程正在等待时,线程将返回到池中,等待完成后,协程将在池中的空闲线程上恢复。

作为另一种解决方法:

suspend fun compareElements(
    isReady: Boolean? = null
) {
   val isReady0 = isReady ?: isReady()
   ...
}