ber*_*o.g 5 android kotlin kotlin-coroutines
我需要调用一个内部的悬吊功能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)
}
Run Code Online (Sandbox Code Playgroud)
您不能suspend在suspendCoroutine块中调用函数,因为它接受非挂起块作为参数:
suspend inline fun <T> suspendCoroutine(
crossinline block: (Continuation<T>) -> Unit
): T
Run Code Online (Sandbox Code Playgroud)
'suspendCoroutine' 主要在我们有一些带有回调的遗留代码时使用,例如:
suspend fun getUser(id: String): User = suspendCoroutine { continuation ->
Api.getUser(id) { user ->
continuation.resume(user)
}
}
Run Code Online (Sandbox Code Playgroud)
如果函数someFunction()没有通过回调调用 Api,那么您应该重新考虑摆脱“suspendCoroutine”的方法:
private suspend fun someFunction() {
// ...
val myResult = mySuspendingFunction()
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果您仍然想使用块外的suspendCoroutine移动调用:mySuspendingFunctionsuspendCoroutine
private suspend fun someFunction(): String {
val myResult = mySuspendingFunction()
return suspendCoroutine { cont ->
//...
cont.resume(myResult)
}
}
suspend fun mySuspendingFunction(): String {
delay(1000) // simulate request
return "result"
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2354 次 |
| 最近记录: |