Promise含回调时的执行顺序疑问:JavaScript代码输出困惑
为什么你的Promise代码输出顺序和预期不一样?
先拆解代码的执行逻辑,帮你理清顺序问题:
- 同步任务优先执行
JavaScript是单线程语言,所有同步代码会按顺序先执行完毕:
- 创建Promise实例时,构造函数内部的代码会同步运行:
- 将
setTimeout的回调(10秒后输出"promise executed")放入宏任务队列等待执行 - 立刻调用
res("async executed"),把Promise的状态改为resolved,同时将.then里的回调放入微任务队列等待
- 将
- 接着执行
console.log("sync programming in progress"),输出对应内容 - 随后注册Promise的
.then和.catch(回调不会立刻执行,只是进入队列) - 最后执行
console.log("sync program done"),输出对应内容
- 同步任务结束后,先处理微任务队列
同步代码跑完后,JavaScript引擎会优先清空所有微任务:
- 取出
.then的回调执行,输出res的值"async executed"
- 微任务清空后,再处理宏任务队列
等微任务队列空了,才会轮到处理宏任务队列里的任务:
- 10秒后,
setTimeout的回调执行,输出"promise executed"
为什么"async executed"没延迟10秒?
因为res("async executed")是同步调用的,根本没等setTimeout。你把res写在setTimeout外面,Promise的状态会立刻变成resolved,.then的回调自然会在同步任务结束后马上执行,和10秒延迟完全无关。如果想让"async executed"在10秒后输出,需要把res移到setTimeout的回调里:
let promise = new Promise((res, rej) => { setTimeout(() => { console.log("promise executed"); res("async executed"); // 把res移到这里 }, 10000); });
内容的提问来源于stack exchange,提问作者Rosh
相关产品推荐
相关产品推荐

