JavaScript微任务核心是Promise状态变更后自动入队回调,典型来源包括.then()/.catch()/.finally()、Promise构造器中resolve/reject触发的回调、async函数隐式Promise、Promise.resolve()/reject()配合then的组合。

JavaScript 微任务中常见的 Promise 回调机制,核心在于“状态变更后自动入队”,而非所有 Promise 相关代码都算微任务。关键看回调是否被注册在 fulfilled 或 rejected 状态触发时执行 的位置。
Promise.prototype.then() / .catch() / .finally()
这是最典型的微任务来源:
- 只要 Promise 状态变为 fulfilled 或 rejected,其绑定的
.then()、.catch()、.finally()回调就会被推入微任务队列 - 注意:
.then()方法本身是同步执行的,它只是注册回调并返回新 Promise;真正异步执行的是回调函数 - 链式调用中每个
.then()都会产生一个新的微任务(如果前一个已 settled)
Promise 构造器中的 resolve/reject 触发的后续回调
Promise 构造函数内部的 executor 是同步执行的,但它的效果会引发微任务:
-
new Promise((resolve) => { resolve(); }).then(() => {...})——resolve()同步改变状态,随后.then()回调进入微任务队列 - 即使 Promise 已经处于 fulfilled 状态,后续再调用
.then(),回调仍会作为微任务立即调度(规范保证)
async 函数隐式返回的 Promise 回调
async 函数本质是语法糖,其返回值总是 Promise,await 后的代码会被编译为 .then() 链:
立即学习“Java免费学习笔记(深入)”;
-
async function f() { await Promise.resolve(); console.log('done'); }中,console.log实际被包装进微任务回调 - 哪怕函数体内没有 await,
return value也会被Promise.resolve()包装,因此asyncFn().then(...)的回调仍是微任务
Promise.resolve() / Promise.reject() 配合 then 的组合
这些静态方法创建的 Promise 状态已是 settled,其后续 .then() 会立刻排队:
-
Promise.resolve(42).then(x => console.log(x))—— 回调属于微任务 -
Promise.reject(new Error()).catch(...)同理,错误处理回调也走微任务队列 - 它们常用于统一异步/同步路径,确保行为一致且可预测
不复杂但容易忽略:微任务不是靠“用了 Promise”就自动产生,而是依赖状态变更 + 回调注册这个组合。没调用 .then(),或 Promise 始终 pending,就不会有微任务发生。


















