promise构造函数的executor函数必须同步立即执行,属于同步代码流,其内部调用resolve/reject仅触发微任务,确保初始化可预测且语义清晰。

因为 Promise 构造函数的设计规范明确要求:传入的 executor 函数必须在 new Promise 被调用时**立刻、同步执行**,这是 ES6 标准强制规定的执行行为,不是可选优化。
Promise 构造函数的 executor 是同步入口
构造函数接收一个函数参数(通常叫 executor),它的作用是“启动异步逻辑”,但自身不负责异步——它只是你编写初始代码的地方。标准规定这个函数必须被立即调用,就像普通函数调用一样压入调用栈执行。
- 它不属于微任务,不会等当前宏任务结束才运行
- 它和 console.log、变量赋值、for 循环 一样,属于同步代码流的一部分
- 即使里面写了 setTimeout 或 fetch,executor 本身仍同步执行,只是把异步操作“发出去”而已
为什么这样设计?
这种同步执行机制让 Promise 具备可预测的初始化行为,方便封装各种异步源头:
- 你可以立刻检查输入参数是否合法,提前 reject
- 可以同步启动定时器、发起请求、读取文件句柄等操作
- 避免“创建 Promise 却迟迟不开始干活”的歧义,语义更清晰
和 then 的执行时机形成对比
executor 同步执行,但 resolve() 或 reject() 的调用效果是异步的——它们触发的状态变更会被放入微任务队列,等当前同步代码跑完才处理。
- 所以 new Promise(() => { console.log('a'); resolve(); console.log('b'); }) 会先输出 a、b,再执行 then 回调
- 这正是“构造同步,状态变更异步”的典型体现
实际影响:别在 executor 里写阻塞逻辑
既然它是同步执行的,长时间运行的代码(比如大循环、JSON.parse 超大字符串)会卡住主线程:
- ❌ 不推荐:for (let i = 0; i 写在 executor 里
- ✅ 推荐:把耗时计算移到 setTimeout、queueMicrotask 或 Web Worker 中
- 否则 Promise 看似“异步”,实际第一步就同步阻塞了
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











