有人可以解释一下这两者之间到底有什么区别吗?
你什么时候用一个?
提前致谢。
最佳答案
解释差异的最好方法是解释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/