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
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)
执行顺序分析
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
这些宏任务)。