看到这个隔壁帖子( https://www.v2ex.com/t/830515 )有感。async/await 的基本逻辑是这样:
async myFunction() {
// some code
await readSomething() // 执行至此处函数交出控制权,读取完成后回到此处继续执行
// some code
await sendRequest() // 再次交出控制权
}
和这个模型最为贴近的是协程(生成器),await 相当于一次 yield ,然后等待外面 call 自己的作为调度器的某个东西再 resume 进来。Swift 5.5 加入了 async/await ,把这个调度器做到了系统的事件循环里,所以(起初)需要新系统支持。
然后查了一下 TypeScript 和 Rust 的实现,都是基于状态机,原理其实和 Swift 的类似。但换种方向直观理解,async/await 好像也可以改写成嵌套回调,比如:
// some code
readSomething(() => {
// some code
sendRequest(() => {
// some code
})
})
因为有闭包,所以循环也可以通过改成尾递归再写成这种格式。了解了下这种格式有个学名叫 Continuous-passing style ( https://en.wikipedia.org/wiki/Continuation-passing_style ),看起来也很合理。但为什么很多编程语言都选择了另一种实现方式呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.