【问题标题】:How to Call Suspend Function from Function如何从函数中调用挂起函数
【发布时间】:2020-04-13 22:55:01
【问题描述】:

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

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()

【问题讨论】:

    标签: kotlin kotlin-coroutines suspend


    【解决方案1】:

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

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

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

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

    如果你真的需要使用isReady函数,那么在函数compareElements里面获取它的值,然后使用它。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        我们看到在计算上调用了await,所以它可能是async返回Deferred,这意味着它可以启动另一个协程

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

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

        【讨论】:

          【解决方案4】:

          另一种解决方法:

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

          【讨论】:

            猜你喜欢
            • 2021-12-21
            • 1970-01-01
            • 2021-11-24
            • 1970-01-01
            • 1970-01-01
            • 2019-05-24
            • 1970-01-01
            • 2020-11-07
            • 2019-05-30
            相关资源
            最近更新 更多