什么是暂停协程?
What is suspendCoroutine?
我是初学者coroutines
.
不完全是,但我对coroutine
是什么有点了解。
suspend function
也比较难,但稍微了解一下。
正在按部就班地学习,但有些地方还是不懂。
那是 suspendCoroutine
。在示例代码中,出现了块中使用的suspendCoroutine
和Continuation
,但我不知道这两个是什么。
我在其他网站上看过,但找不到任何地方可以轻松解释它。
您能简单地解释一下 suspendCoroutine
和 Continuation
的用途吗?如果可能,请举例说明?
suspendCoroutine
是一个构建函数,主要用于将回调函数转换为suspend
函数。例如,假设您有一些使用回调的遗留(或没有)Api。您可以轻松地将其转换为 suspend
函数以在协程中调用它。例如:
suspend fun getUser(id: String): User = suspendCoroutine { continuation ->
Api.getUser(id) { user ->
continuation.resume(user)
}
}
这里我们有一个 Api 函数 getUser
,它在 Api
class 中定义,例如:
fun getUser(id: String, callback: (User) -> Unit) {...}
suspendCoroutine
暂停执行它的协程,直到我们决定通过调用适当的方法继续 - Continuation.resume...
。
suspendCoroutine
主要在我们有一些带有回调的遗留代码时使用。
使用 suspendCoroutine
将回调转换为 suspend
函数使得代码在您使用 suspend
函数时是连续的。
例如,而不是像这样的回调地狱:
Api.getUser(id) { user ->
Api.getProfile(user) { profile ->
Api.downloadImage(profile.imageId) { image ->
// ...
}
}
}
将 suspendCoroutine
应用到这些回调并将它们转换为 suspend
函数后,代码将如下所示:
val user = getUser(id)
val profile = getProfile(user)
val image = downloadImage(profile.imageId)
//...
我是初学者coroutines
.
不完全是,但我对coroutine
是什么有点了解。
suspend function
也比较难,但稍微了解一下。
正在按部就班地学习,但有些地方还是不懂。
那是 suspendCoroutine
。在示例代码中,出现了块中使用的suspendCoroutine
和Continuation
,但我不知道这两个是什么。
我在其他网站上看过,但找不到任何地方可以轻松解释它。
您能简单地解释一下 suspendCoroutine
和 Continuation
的用途吗?如果可能,请举例说明?
suspendCoroutine
是一个构建函数,主要用于将回调函数转换为suspend
函数。例如,假设您有一些使用回调的遗留(或没有)Api。您可以轻松地将其转换为 suspend
函数以在协程中调用它。例如:
suspend fun getUser(id: String): User = suspendCoroutine { continuation ->
Api.getUser(id) { user ->
continuation.resume(user)
}
}
这里我们有一个 Api 函数 getUser
,它在 Api
class 中定义,例如:
fun getUser(id: String, callback: (User) -> Unit) {...}
suspendCoroutine
暂停执行它的协程,直到我们决定通过调用适当的方法继续 - Continuation.resume...
。
suspendCoroutine
主要在我们有一些带有回调的遗留代码时使用。
使用 suspendCoroutine
将回调转换为 suspend
函数使得代码在您使用 suspend
函数时是连续的。
例如,而不是像这样的回调地狱:
Api.getUser(id) { user ->
Api.getProfile(user) { profile ->
Api.downloadImage(profile.imageId) { image ->
// ...
}
}
}
将 suspendCoroutine
应用到这些回调并将它们转换为 suspend
函数后,代码将如下所示:
val user = getUser(id)
val profile = getProfile(user)
val image = downloadImage(profile.imageId)
//...