promise构造函数执行是同步的,其executor函数立即运行;resolve/reject调用本身同步,但.then()回调被推入微任务队列,在当前同步代码执行完后才执行。

Promise 构造函数本身不是异步的,它的执行器(executor)函数是同步立即执行的;真正体现“异步”的,是 resolve 或 reject 调用后触发的状态变更和后续 .then() 回调的调度时机——它们被推入微任务队列(microtask queue),在当前同步代码执行完后才执行。
换句话说:
✅ 构造 Promise 的那一行代码,会立刻运行 executor 里的逻辑(比如 console.log、setTimeout、fetch 调用等);
❌ 但 resolve(value) 并不会让 .then() 立刻运行;它只是把回调“预约”到下一个微任务中。
Promise 构造函数的执行是同步的
当你写:
console.log('1. 开始');
new Promise((resolve, reject) => {
console.log('2. 构造器内同步执行');
resolve('搞定');
});
console.log('3. 结束');
输出一定是:
1. 开始 2. 构造器内同步执行 3. 结束
说明构造函数内部逻辑是立刻、同步跑完的,不等异步操作(如网络请求、定时器)。
状态变更(resolve/reject)是“异步感知”的关键
虽然 resolve() 这个调用本身是同步发生的,但它不会立即触发 .then()。JS 引擎会把 .then() 回调放进微任务队列,等当前调用栈清空后再执行。
例如:
console.log('1. 开始');
new Promise(resolve => {
console.log('2. 执行器中');
resolve('成功');
console.log('3. resolve 后仍同步执行');
});
console.log('4. Promise 创建完毕');
// 此时 .then 还没执行
setTimeout(() => console.log('5. 宏任务'), 0);
Promise.resolve().then(() => console.log('6. 微任务'));
输出顺序:
1. 开始 2. 执行器中 3. resolve 后仍同步执行 4. Promise 创建完毕 6. 微任务 5. 宏任务
→ 可见:.then() 是微任务,在所有同步代码之后、宏任务之前执行。
常见误解澄清
- ❌ “Promise 是异步的” —— 不准确。Promise 对象本身是同步创建的,它只是封装并协调异步操作的结果。
- ✅ 正确说法:Promise 提供了一种统一处理异步结果的机制,其
.then()/.catch()回调具有确定的异步调度语义(微任务)。 - ⚠️ 注意:如果 executor 里没调用
resolve/reject,Promise 就永远卡在pending,不会自动“变异步”。
实际开发中要注意什么
- 不要指望
new Promise(...)这一行之后马上拿到结果——.then()总是延迟到下一轮微任务。 - 如果想让某段逻辑“等 Promise 完成再执行”,必须用
.then()、await或显式链式调用,不能靠写在new Promise后面的同步代码。 -
resolve(Promise)会被自动展开(Promise 解析),而resolve(普通值)则直接作为结果传递给后续.then()。
不复杂但容易忽略。











