promise回调属于微任务,因其执行时机在同步代码结束后立即清空微任务队列时,且ecmascript规范明确将其归入promisejobs微任务队列,优先于settimeout等宏任务。

Promise 的回调函数(.then()、.catch()、.finally() 中传入的函数)属于微任务,不是宏任务。
为什么是微任务?看执行时机
JavaScript 执行完一段同步代码后,会立刻检查并清空微任务队列,再取下一个宏任务。这意味着 Promise 回调总比同级的 setTimeout 先执行,哪怕延迟设为 0:
-
console.log('1')→ 同步,立即输出 -
Promise.resolve().then(() => console.log('2'))→ 回调入微任务队列 -
setTimeout(() => console.log('3'), 0)→ 回调入宏任务队列 -
console.log('4')→ 同步,立即输出
输出顺序一定是 1 → 4 → 2 → 3,因为“2”在同步代码结束后、下一个宏任务(“3”)之前被执行。
为什么是微任务?看规范定义
ECMAScript 规范明确将 Promise 履行(fulfill)或拒绝(reject)后触发的回调,归入 PromiseJobs 队列——这是标准的微任务队列之一。它和 MutationObserver 回调同级,优先级高于 setTimeout、setInterval、I/O 等宏任务。
注意两个常见误区
• new Promise(fn) 中的 fn 是同步执行的;只有 .then() 等方法里的回调才是微任务。
• setTimeout(fn, 0) 不是“立刻执行”,而是“最早可调度时入宏任务队列”;Promise.resolve().then(fn) 的 fn 是“当前任务一结束就执行”,即典型的微任务语义。
链式调用也遵循微任务规则
每个 .then() 返回的新 Promise,其后续回调仍按微任务规则入队。无论前一个 Promise 是同步 resolve 还是异步 resolve,它的回调都进入微任务队列,不受上层 resolve 时间影响。











