Skip to content

Promise 执行顺序

new Promise 的执行时机

在 JavaScript 中,new Promise 的执行分为两个部分:

  1. Promise 构造函数(同步执行)
  2. resolve / reject 后的 .then()(异步执行 - 微任务)

1️⃣ Promise 构造函数:立即执行(同步代码)

new Promise(executor) 被创建时:

  • executor(即 resolvereject 之前的代码)会立即执行
  • resolve()reject() 不会立即执行 .then() 里的回调,而是将回调加入微任务队列

示例:

js
console.log('A')

const promise = new Promise((resolve) => {
  console.log('B')
  resolve()
  console.log('C')
})

console.log('D')

promise.then(() => {
  console.log('E')
})

console.log('F')

执行顺序分析

  1. console.log('A')输出: A
  2. new Promise(...) 立即执行:
    • console.log('B')输出: B
    • resolve() 被调用(但 .then() 里的回调不会立刻执行)
    • console.log('C')输出: C
  3. console.log('D')输出: D
  4. promise.then(...) 进入微任务队列
  5. console.log('F')输出: F
  6. 事件循环执行微任务:
    • console.log('E')输出: E

最终输出:

A
B
C
D
F
E

2️⃣ resolve() 触发 .then()(微任务执行时机)

微任务(Microtask)是在当前执行栈清空后立即执行的任务,比 setTimeout 这些宏任务(Macrotask)优先执行。

js
console.log(1)

new Promise((resolve) => {
  console.log(2)
  resolve()
  console.log(3)
}).then(() => {
  console.log(4)
})

console.log(5)

执行顺序分析

  1. console.log(1)输出: 1
  2. new Promise(...) 立即执行:
    • console.log(2)输出: 2
    • resolve() 被调用(微任务入队)
    • console.log(3)输出: 3
  3. console.log(5)输出: 5
  4. 执行微任务 promise.then(...)
    • console.log(4)输出: 4

最终输出:

1
2
3
5
4

总结

  1. new Promise(executor) 里的代码 立即执行(同步)。
  2. resolve() 并不会立即执行 .then(),而是把 .then() 加入微任务队列。
  3. 微任务(Microtask)会在当前同步代码执行完毕后立即执行(优先于 setTimeout 这些宏任务)。