在调用suspendCoroutine之前,我需要在continuation.resume()块中调用一个暂停函数。
这样做的适当方法是什么?

private suspend fun someFunction() = suspendCoroutine { cont ->
    //...
    val myResult = mySuspendingFunction() //<--- The IDE says "Suspension functions can be called only within coroutine body"
    cont.resume(myResult)
}

最佳答案

您不能在 suspend 块中调用suspendCoroutine函数,因为它接受非暂挂块作为参数:

suspend inline fun <T> suspendCoroutine(
    crossinline block: (Continuation<T>) -> Unit
): T
'suspendCoroutine'主要在我们有一些带有回调的遗留代码时使用,例如:
suspend fun getUser(id: String): User = suspendCoroutine { continuation ->
      Api.getUser(id) { user ->
          continuation.resume(user)
      }
}
如果someFunction()函数未使用回调调用Api,则应重新考虑摆脱“suspendCoroutine”的方法:
private suspend fun someFunction() {
    // ...
    val myResult = mySuspendingFunction()
    // ...
}
如果仍然要使用suspendCoroutine,则将mySuspendingFunction的调用移出suspendCoroutine块:
private suspend fun someFunction(): String {
    val myResult = mySuspendingFunction()

    return suspendCoroutine { cont ->
        //...
        cont.resume(myResult)
    }
}

suspend fun mySuspendingFunction(): String {
    delay(1000) // simulate request
    return "result"
}

09-30 18:15