如何从函数中调用挂起函数

How to Call Suspend Function from Function

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

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 {} 块中调用),它挂起协程直到完成一些计算并且 returns 其结果:

async { // Here I call it the outer async coroutine
    ...
    // Here I call computation the inner coroutine
    val result = computation.await()
    ...
}

我们看到 await 在计算时被调用,所以 returns Deferred 可能是异步的,这意味着它可以启动另一个协程

fun computation(): Deferred<Boolean> {
    return async {
        true
    }
}

挂起是否意味着当外部异步协程正在等待(等待)内部计算协程完成时,它(外部异步协程)空闲(因此得名挂起)并且 returns 线程到线程池,当子计算协程完成时,它(外部异步协程)醒来,从池中获取另一个线程并继续?线程在协程等待时返回到池中,等待完成后,协程在池中的空闲线程上恢复。

另一种解决方法:

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