请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

yield到底挂起了么?

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么?

正在回答 回答被采纳积分+3

1回答

bennyhuo 2020-06-04 10:27:20

这里返回的Unit只是假象,真正的返回值类型是 Any,当没有结果返回的时候,suspendCoroutine内部会处理返回挂起标记对象来告诉协程它要挂起的。

这里没有执行 continuation.resume,自然没有结果,没有结果就必然要挂起等结果了。

0 回复 有任何疑惑可以回复我~
  • 老师我还没听懂这块。我猜测是suspendCoroutine做了某些处理,如果continuation.resume直接可以返回值,那就直接返回,这就属于您讲的没真正挂起。如果不能立即返回值就返回COROUTINE_SUSPENDED。这就属于真正的挂起。
    请问这样理解对吗
    回复 有任何疑惑可以回复我~ 2020-08-18 16:07:17
  • 对没错
    回复 有任何疑惑可以回复我~ 2020-08-18 18:45:57
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信