promise的then回调由引擎自动以微任务调度,比settimeout更快;其执行时机为同步代码结束后、下一轮宏任务前;then返回新promise,状态由回调返回值决定。

Promise 的 then 回调本身不是“手动异步”,而是由 JavaScript 引擎按规范自动以微任务(microtask)方式调度执行——它天然异步,但比 setTimeout 更快、更及时。
回调何时被加入微任务队列
调用 then 时,引擎会立即检查当前 Promise 的状态:
- 如果 Promise 已处于 fulfilled 或 rejected 状态,回调函数立刻被封装为微任务,推入微任务队列;
- 如果 Promise 还是 pending 状态,回调会被暂存到该 Promise 的内部回调列表中,等后续调用
resolve或reject时,再统一推入微任务队列。
为什么看起来像“异步”,却比 setTimeout 快
微任务的执行时机固定在:
- 当前同步代码全部执行完毕后;
- 浏览器渲染前;
- 下一轮宏任务(如
setTimeout)开始前。
所以哪怕写 setTimeout(() => console.log(1), 0) 和 Promise.resolve().then(() => console.log(2)),输出永远是 2 → 1。
回调函数本身不阻塞,但执行逻辑可同步或异步
then 回调函数体内的代码仍是普通 JavaScript:它可能同步完成(比如直接返回一个值),也可能触发新的异步操作(比如发起 fetch 或调用 setTimeout)。关键点在于:
- 回调函数的 调用时机 由微任务机制保证非阻塞;
- 回调函数的 内部行为 完全由你控制,不影响外层调度逻辑。
链式调用中状态如何传递
每个 then 返回新 Promise,其状态取决于回调的返回值:
- 返回普通值 → 新 Promise 变为 fulfilled,值为该返回值;
- 抛出异常 → 新 Promise 变为 rejected,原因即该异常;
- 返回另一个 Promise → 新 Promise 状态跟随该 Promise。
这种设计让异步流程自然串联,无需手动管理嵌套或状态流转。











