如何从函数中调用挂起函数
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()
...
}
我正在尝试在另一个挂起函数的参数中调用一个挂起函数。编译器实际上不允许这样做。它告诉我必须从挂起函数或协程调用挂起函数。
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()
...
}