kotlin - 何时使用 coroutineScope 与 supervisorScope?

标签 kotlin kotlin-coroutines

有人可以解释一下这两者之间到底有什么区别吗?

你什么时候用一个?

提前致谢。

最佳答案

解释差异的最好方法是解释coroutineScope的机制。 .考虑这个代码:

suspend fun main() = println(compute())

suspend fun compute(): String = coroutineScope {
    val color = async { delay(60_000); "purple" }
    val height = async<Double> { delay(100); throw HttpException() }
    "A %s box %.1f inches tall".format(color.await(), height.await())
}
compute()从网络中获取两个东西并将它们组合成一个字符串描述。在这种情况下,第一次获取需要很长时间,但最终成功;第二个几乎立即失败,100 毫秒后。

你希望上面的代码有什么行为?
  • 你愿意color.await()一分钟,才发现对方网络调用早就失败了?
  • 或者您可能想要 compute()函数在 100 毫秒后实现其网络调用之一失败并立即失败?

  • supervisorScope你得到 1.,与 coroutineScope你得到 2。

    2. 的行为意味着,即使 async本身不会抛出异常(它只是完成了您从中获得的 Deferred),失败会立即取消其协程,从而取消父项,然后取消所有其他子项。

    当您不知道时,这种行为可能会很奇怪。如果你去捕获 await() 中的异常,你会认为你已经从中恢复过来,但你没有。整个协程范围仍在取消。在某些情况下,您不想要它是有正当理由的:那时您将使用 supervisorScope .

    关于kotlin - 何时使用 coroutineScope 与 supervisorScope?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53577907/

    相关文章:

    kotlin - 在不传播的情况下访问对象中的 ApplicationCall

    kotlin - 如何控制kotlin-native的 “native dependency”下载的目标目录?

    android - Kotlin 流中缓冲区之间的差异

    android - withStateAtLeast 和 whenStateAtLeast 生命周期扩展方法的区别

    android - 使用协程在 api 请求之前从房间数据库加载数据

    java - 为什么当我从 kotlin 项目程序调用 java 类时总是停止工作

    android - 仅显示 5 个点指示器,供我需要隐藏的剩余 viewpager

    android - Kotlin 中 SearchView 的过滤器

    android - 类型不匹配 : inferred type is AutoMigration but KClass<*> was expected

    android - 从非生命周期类的主调度程序切换到 IO 调度程序