在调用continuation.resume()
之前,我需要在suspendCoroutine
块中调用一个suspending函数,什么是合适的方法呢?
private suspend fun someFunction() = suspendCoroutine { cont ->
//...
val myResult = mySuspendingFunction() //<--- The IDE says "Suspension functions can be called only within coroutine body"
cont.resume(myResult)
}
2条答案
按热度按时间j9per5c41#
不能在
suspendCoroutine
块中调用suspend
函数,因为它接受非挂起块作为参数:'suspendCoroutine'主要在我们有一些带有回调的遗留代码时使用,例如:
如果函数
someFunction()
没有使用回调函数调用API,那么您应该重新考虑您的方法,以去除'suspendCoroutine':如果您仍然希望使用
suspendCoroutine
,请将mySuspendingFunction
的调用移出suspendCoroutine
块:46qrfjad2#
最好避免这种情况,并且在
suspendCoroutine
之前调用suspending函数,正如其他人已经回答的那样,这对于所讨论的特定情况是可能的。但是,如果您需要延续,则无法执行此操作。
(The下面是给那些因为这个原因而发现这个问题的人的,就像@Zordid和我一样。
chan.send
就是一个例子。)在这种情况下,下面是一种可能的,但容易出错的方法,我 * 不 * 推荐:
(我认为错误处理本身就说明了为什么它不是一个很好的选择,尽管还有其他问题。)
一种更好、更安全、更便宜的方法是尽可能使用
CompletableDeferred
。如果你 * 必须 * 传递一个Continuation,那么这样做仍然更安全,而且可能更便宜: