19|异步编程(二):V8是如何实现async/await的?
该思维导图由 AI 生成,仅供参考
什么是回调地狱?
- 深入了解
- 翻译
- 解释
- 总结
V8引擎是如何实现async/await的? JavaScript的单线程设计导致了回调地狱问题,为了解决这一问题,JavaScript社区提出了一系列方案,从Promise到Generator,再到最近的async/await。本文介绍了Promise和Generator函数的使用,以及V8是如何实现async/await的机制。通过对Promise和Generator函数的使用,以及协程的工作原理的解释,读者可以理解async/await的实现原理。文章通过代码示例和图表,生动地展示了这些概念的运作方式,帮助读者更好地理解JavaScript中异步编程的发展和V8的实现机制。 文章详细介绍了async/await的工作原理,以及V8引擎是如何处理await后面的内容的。通过对Promise对象的状态变化和协程的应用进行解释,读者可以清晰地理解async/await的实现机制。此外,文章还对异步编程模型的发展历程进行了梳理,从回调地狱问题到Promise和Generator函数的应用,最终演化到async/await的“终极”方案。 总的来说,本文通过深入浅出的方式,帮助读者理解了JavaScript中异步编程的发展历程以及V8引擎是如何实现async/await的机制。读者可以通过本文了解到async/await的演化过程,以及其与co+generator的比较优秀的设计,从而对前端异步编程的方案史有更清晰的认识。 通过本文的阅读,读者可以更好地理解JavaScript中异步编程的发展历程,以及async/await的实现原理,为他们在实际开发中更好地应用这些技术提供了重要的参考和指导。
《图解 Google V8》,新⼈⾸单¥59
全部留言(24)
- 最新
- 精选
- 若川置顶co源码实现原理:其实就是通过不断的调用generator函数的next()函数,来达到自动执行generator函数的效果(类似async、await函数的自动自行)。 具体代码分析,我之前写过一篇文章: 《学习 koa 源码的整体架构,浅析koa洋葱模型原理和co原理》 https://juejin.im/entry/5e6a080af265da575b1bd160
作者回复: 赞,高手
2020-05-02644 - HoSalt老师 async、await 是 generator promise 的语法糖吗,v8里面前者是借助后者实现的吗?async await 为什么能用try catch 捕获错误?
作者回复: async/await可以不是语法糖,而是从设计到开发都是一套完整的体系,只不过使用了协程和promise! 支持try catch也是引擎的底层来实现的
2020-04-2911 - Geek_gaoqin哦,我知道了,async 修饰的函数会有自己的协程,那么它代码内部创建的宏任务,主线程有空了还是会拿消息队列中的宏任务来执行,如果await等待了一个never resolve,那么它后面的代码就再也不会执行!但是却不会影响消息队列中键盘鼠标事件等其它任务的执行!
作者回复: 是这样的
2020-06-119 - 潇潇雨歇co的原理是自动识别生成器代码的yield,做暂停执行和恢复执行的操作
作者回复: 没问题
2020-04-287 - 蹦哒请教老师:为什么Generator方案不实现自动执行next的功能呢?我理解async/await相对于Generator方案主要是能够自动执行next吧,co方案也是这么做的
作者回复: 如果自动执行了,那么就是await了,之所以没有这样实现,我想是因为技术在迭代发展吧,完美的技术总是很难一步到位
2020-05-1255 - Geek_gaoqin老师,很长很长一段代码中,业务逻辑很复杂,既有产生微任务,又有setTimeout产生宏任务,更有很多await的语句,那么这些结合上一章节讲的内容,它的执行顺序是怎样的呢?可以帮我分析下吗?
作者回复: 微任务先执行,settimeout后执行,await可以跨越多个宏任务
2020-06-111 - 华仔setTimeout(() => { console.log('in timeout'); }) new Promise((resolve, reject) => { setTimeout(() => { resolve(3); console.log('in promise-timeout') }) console.log('in promise') }).then((res) => { console.log('in then') }) 老师,想问下promise创建的then是微任务,是宏任务中创建的队列保存的消息队列中维护的。那么我这里这样一个场景,在promise中通过setTimeout(模拟宏任务http request)异步resolve的场景下,then也就会在下一个宏任务执行之后再执行了。这种当前宏任务中注册的微任务被拖到下一个宏任务执行,是怎么实现的呢?
作者回复: 微任务是在reslove时生成的,你创建一个peomise并不会立马产生一个微任务,而是要等到resolve或者reject时,才会触发微任务,在那个宏任务中触发了微任务,微任务就在该宏任务快要执行结束之后执行,无论你promise是在拿个宏任务中创建的!
2020-05-0541 - 断线人偶老师可以讲一下为什么在使用async...await...可以通过try...catch...来捕获到异步函数中的异常吗,v8是怎么实现的
作者回复: 这个是V8实现的,比如触发了reject的时候,v8就会跳转到catch
2020-05-24 - 地球外地人老师能讲讲 generate 和 await async中的闭包吗?
作者回复: 闭包的实现原理都是一样的,你可以列出具体问题,我来给你回答,最好新开一个回复,这样我更容易看到
2020-05-04 - 天然呆function HaveResolvePromise(){ return new Promise((resolve, reject) => { setTimeout(() => { resolve(100) }, 0); }) } async function getResult() { console.log(1) let a = await NoResolvePromise() console.log(a) console.log(2) } console.log(0) getResult() console.log(3) 是不是要改动?NoResolvePromise ==>> HaveResolvePromise
作者回复: 嗯 改过来了
2020-04-28