Promise 执行顺序
new Promise 的执行时机
在 JavaScript 中,new Promise 的执行分为两个部分:
- Promise 构造函数(同步执行)
resolve/reject后的.then()(异步执行 - 微任务)
1️⃣ Promise 构造函数:立即执行(同步代码)
当 new Promise(executor) 被创建时:
executor(即resolve或reject之前的代码)会立即执行。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')执行顺序分析
console.log('A')→ 输出: Anew Promise(...)立即执行:console.log('B')→ 输出: Bresolve()被调用(但.then()里的回调不会立刻执行)console.log('C')→ 输出: C
console.log('D')→ 输出: Dpromise.then(...)进入微任务队列console.log('F')→ 输出: F- 事件循环执行微任务:
console.log('E')→ 输出: E
最终输出:
A
B
C
D
F
E2️⃣ 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)执行顺序分析
console.log(1)→ 输出: 1new Promise(...)立即执行:console.log(2)→ 输出: 2resolve()被调用(微任务入队)console.log(3)→ 输出: 3
console.log(5)→ 输出: 5- 执行微任务
promise.then(...)console.log(4)→ 输出: 4
最终输出:
1
2
3
5
4总结
new Promise(executor)里的代码 立即执行(同步)。resolve()并不会立即执行.then(),而是把.then()加入微任务队列。- 微任务(Microtask)会在当前同步代码执行完毕后立即执行(优先于
setTimeout这些宏任务)。