Promise执行顺序疑问:resolve嵌套Promise为何晚于3输出?
Promise嵌套resolve的执行顺序解析
要理解为什么7会在3之后打印,核心在于用Promise对象resolve另一个Promise时,会触发额外的微任务调度,具体拆解如下:
关键规范点
根据Promise A+规范,当调用resolve(x)时:
- 如果
x是普通值,当前Promise会立即进入resolved状态,其then回调直接加入微任务队列。 - 如果
x是Promise对象(或thenable对象),当前Promise会"接管"x的状态:即使x已经是resolved状态,当前Promise的状态变更和then回调的调度也需要额外经过一次微任务周期,而非同步完成。
代码执行流程
我们一步步走你的代码逻辑:
同步代码阶段
- 第一个Promise执行器调用
res(1),状态变为resolved(值1),它的第一个then回调(打印1)被加入微任务队列。 - 第二个Promise执行器调用
resolve(内层Promise),内层Promise立即调用resolve(7),状态变为resolved(值7)。此时外层Promise不会直接进入resolved状态,而是会生成一个专门处理嵌套Promise的微任务,等待后续调度。
- 第一个Promise执行器调用
第一轮微任务
- 执行第一个Promise的第一个
then回调:打印1,返回普通值2。第一个Promise的第二个then回调(打印2)被加入下一轮微任务队列。
- 执行第一个Promise的第一个
第二轮微任务
- 执行第一个Promise的第二个
then回调:打印2,返回普通值3。第一个Promise的第三个then回调(打印3)被加入下一轮微任务队列。
- 执行第一个Promise的第二个
第三轮微任务
- 执行第一个Promise的第三个
then回调:打印3,返回普通值4。第一个Promise的第四个then回调(打印4)被加入微任务队列。 - 同时,处理嵌套Promise的微任务执行:外层Promise的状态变为resolved(值7),它的
then回调(打印7)被加入当前微任务队列的末尾。
- 执行第一个Promise的第三个
第四轮微任务
- 先执行打印
7的回调,再执行打印4的回调。
- 先执行打印
最终输出顺序就是:1 → 2 → 3 → 7 → 4,这就解释了为什么7会在3之后打印。
内容的提问来源于stack exchange,提问作者Ricky W. Chew
相关产品推荐
相关产品推荐

