什么是suspendCoroutine?

我是学习 coroutines 的初学者。

不完全是,但我对 coroutine 是什么有点了解。

suspend function 也比较难,但是有点理解。

我正在一步一步地学习,但有些部分我不明白。

那是 suspendCoroutine 。在示例代码中,块中使用的 suspendCoroutineContinuation 出现了,但我不知道这两个是什么。

我在其他网站上看过,但我找不到任何容易解释的地方。

你能解释一下 suspendCoroutineContinuation 的用途吗?如果可能的话,可以举个例子吗?

stack overflow What is suspendCoroutine?
原文答案
author avatar

接受的答案

suspendCoroutine 是一个构建器函数,主要用于将回调转换为 suspend 函数。例如,假设您有一些使用回调的遗留(或没有)Api。您可以轻松地将其转换为 suspend 函数以在协程中调用它。例如:

suspend fun getUser(id: String): User  = suspendCoroutine { continuation ->
      Api.getUser(id) { user ->
          continuation.resume(user)
      }
}

这里我们有一个 Api 函数 getUser ,它在 Api 类中定义,例如:

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)
//...

答案:

作者头像

suspendCoroutine 是 Kotlin 对 Scheme 函数 call-with-current-continuation 的名称(简称 call/cc )。

此视频 "Fresh Async With Kotlin • Roman Elizarov • GOTO 2018" 对此进行了解释。

文章 "The Yin-yang puzzle in Kotlin" 基于 Yin-yang puzzle 对其进行了解释,这是 call/cc 的著名示例用例。其他用例在文章 "Continuations by example: Exceptions, time-traveling search, generators, threads, and coroutines" 中进行了解释。