yield到底挂起了么?
来源:11-7 案例:Generator 与标准库的序列生成器

MarcoLhc
2020-06-04
private fun resume() {
when (val curState = state) {
is State.NotReady -> curState.continuation.resume(Unit)
}
}
override suspend fun yield(value: T) = suspendCoroutine<Unit> { continuation ->
state = when (state) {
is State.NotReady -> State.Ready(continuation, value)
is State.Ready<*> -> throw IllegalStateException("Cannot yield a value while ready")
State.Done -> throw IllegalStateException("Cannot yield a value while done")
}
}
第一次执行resume会启动协程,然后运行到yield,yield运行结束是不是挂起了。然后运行权又回到了调用resume的地方。但是前面不是说挂起需要异步么?这里的返回值是Unit,不需要显示的返回COROUTINE_SUSPENDED么?
写回答
1回答
-
bennyhuo
2020-06-04
这里返回的Unit只是假象,真正的返回值类型是 Any,当没有结果返回的时候,suspendCoroutine内部会处理返回挂起标记对象来告诉协程它要挂起的。
这里没有执行 continuation.resume,自然没有结果,没有结果就必然要挂起等结果了。
022020-08-18