在JavaScript的世界里,异步执行一直是个让人头疼的话题。但你知道吗?即使是看似简单的代码,背后也可能隐藏着复杂的执行逻辑。今天,我们就通过一道经典的面试真题,来揭开JavaScript异步执行的神秘面纱。
请写出以下代码的打印顺序:
Promise.resolve()
.then(() => { console.log(0); return Promise.resolve(4); })
.then((res) => { console.log(res); })
.then(() => { console.log(1); })
.then(() => { console.log(2); })
.then(() => { console.log(3); })
.then(() => { console.log(5); })
.then(() => { console.log(6); });
正确答案:0 1 2 3 4 5 6
让我们一步步地揭开这段代码的执行过程。
第一阶段 - 初始化
初始微任务队列为空。
第二阶段 - 同步代码执行
创建两个已完成的Promise实例,并注册各自的.then
回调微任务队列:
第三轮 - 执行第一个Promise.then1
打印0,返回一个新的Promise实例。
第四轮 - 执行第二个Promise.then1
打印1,返回普通值(自动包装为Promise)。
第五轮 - 微任务队列更新
微任务队列新增:
第六轮 - 执行第二个Promise.then2
打印2,返回普通值。
第七轮 - 微任务队列更新
微任务队列新增:
第八轮 - 执行第一个Promise.then3
打印3,返回普通值。
此时,第一个链的Promise.resolve(4)解析完成,触发两个微任务:
第九轮 - 执行第一个Promise.then2
打印4。
第十轮 - 执行第二个Promise.then4
打印5。
第十一轮 - 异步结果处理
执行第一个Promise.then4打印6。
graph TD
A[同步代码] --> B[微任务队列初始化]
B --> C[执行第一个then1]
C --> D[触发Promise解析]
B --> E[执行第二个then1]
E --> F[链式入队then2]
F --> G[执行then2]
G --> H[链式入队then3]
H --> I[执行then3]
I --> J[解析完成触发回调]
J --> K[执行第一个then2]
K --> L[执行后续then4]
L --> M[执行最后then5]
.then()
返回Promise时,会产生两个隐式微任务:等待Promise状态变更执行后续回调链式调用。.then()
都会创建新的微任务,即使返回普通值事件循环特性同一层级的微任务按入队顺序执行,但嵌套Promise会打破线性顺序。本题目源自知名技术面试平台面试派(mianshipai.com),该平台汇集了各大厂最新面试真题,特别感谢其精心整理的优质题库为开发者提供的学习支持。建议读者访问官网获取更多面试资源。
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
Copyright 2005-2024 yuanmayuan.com 【源码园】 版权所有 备案信息
声明: 本站非腾讯QQ官方网站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告