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,自然没有结果,没有结果就必然要挂起等结果了。

0
2
bennyhuo
回复
慕前端9039556
对没错
2020-08-18
共2条回复

学会Kotlin 突破开发语言瓶颈

如果有一门语言可以取代Java,那么它一定是Kotlin。

1760 学习 · 481 问题

查看课程