promise构造函数的executor函数是同步执行的,即new promise时立即运行其中代码,resolve/reject也同步改变状态,但.then回调被放入微任务队列,待同步代码执行完后才执行。
promise 构造函数里的代码是同步执行的,关键在于它的 executor 函数(也就是传给 new promise(...) 的那个回调)会在实例创建的**那一瞬间立刻运行**,不等待、不排队、不进事件循环。
executor 立刻执行,不等任何时机
只要你写了 new Promise((resolve, reject) => { /* 这里 */ }),花括号里的代码就马上执行,和写一个普通函数调用一样直接。
- 比如
console.log('hello')会紧跟着上一行代码输出,不会被“卡住” - 哪怕里面调用了
resolve()或reject(),这一步也是同步完成的——状态从 pending 变成 fulfilled 或 rejected,即时发生 - 它不依赖 setTimeout、fetch、await 等异步机制;有没有它们,executor 本身都同步跑
resolve/reject 是同步动作,但 then 不是
resolve(42) 这行代码执行时,Promise 内部状态立刻更新,但绑定的 .then(() => {...}) 回调并不会这时运行。
- 这个回调会被放进微任务队列,等当前所有同步代码执行完才轮到它
- 所以你能看到:log A → log B(在 executor 里)→ log C(在 new Promise 后面)→ 最后才是 then 里的 log D
- 别因为 D 晚出现,就误以为 resolve 是异步的——其实是 then 的调度机制导致的延迟
别被“里面写了异步代码”带偏
很多人在 executor 里写 setTimeout 或发起请求,就下意识觉得“整个 Promise 是异步的”。其实不是:
-
new Promise这一行仍是同步执行,只是它内部启动了一个异步任务 - 就像
function f() { setTimeout(...); },调用f()是同步的,不能说 f 是异步函数 - 真正异步的是你安排的业务逻辑(比如网络请求),不是 Promise 构造本身
怎么验证它是同步的?看执行顺序
最直接的方式就是加几行 console.log,观察输出节奏:
console.log('1');<br>new Promise(resolve => console.log('2'));<br>console.log('3');
输出一定是 1 → 2 → 3。如果把 .then(() => console.log('4')) 加上去,4 一定排在 3 后面——这说明构造过程全程参与同步流程,而 then 是后来插入的微任务。











