根据官方文档,
launch
函数的函数签名如下
fun CoroutineScope.launch(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job
其中
block
参数标记为 suspend
和 CoroutineScope
上的扩展
Roman Elizarov 在文章中解释了为什么函数应该被标记为
suspend
或在 CourotineScope
上的扩展,但不能两者都标记。
文章摘录
如果您需要启动一个在函数返回后继续运行的协程,请使您的函数成为 CoroutineScope 的扩展或传递scope: CoroutineScope 作为参数,以便在函数签名中明确您的意图。不要让这些功能暂停
我的问题 - 为什么传递给协程构建器函数的 lambda 不是这种情况?
这意味着
suspend CoroutineScope.() -> Unit
挂起 lambda 只能从 CoroutineScope 调用。看一下这个 example,它解释了 coroutineScope
函数的机制及其语义。