微任务包括Promise.then/catch/finally回调、MutationObserver回调和queueMicrotask()函数,它们在当前宏任务结束后立即、依次、全部执行完毕。

微任务在 Promise 异步链中不是“自动传播”,而是按规则逐层调度:每个 then、catch、finally 的回调本身被推入微任务队列,其执行结果决定下一个微任务是否立即排队或等待。
微任务的触发时机
Promise 状态一旦确定(fulfilled 或 rejected),所有已注册的对应回调(onFulfilled 或 onRejected)会被作为微任务加入当前宏任务结束后的微任务队列。注意:
- Promise 构造函数内的同步代码(如
console.log、resolve())立即执行; -
.then()调用本身是同步的,但它的回调函数不会立刻运行,而是等本轮宏任务结束后才执行; - 即使 Promise 已经处于 fulfilled 状态,
.then()回调仍以微任务形式入队,不会“跳过队列”直接执行。
链式返回值如何影响下一级微任务
每个 then 返回的新 Promise 的状态,直接决定后续微任务是否能“立刻排队”或需“等待解决”:
- 返回普通值(如字符串、数字、
undefined)→ 新 Promise 立即 fulfilled,其后then的回调成为下一个微任务; - 返回一个 pending Promise → 新 Promise 状态暂为 pending,必须等该 Promise 解决后,才将后续
then回调推入微任务队列; - 抛出错误或返回被 reject 的 Promise → 新 Promise 立即 rejected,若链中有
catch,其回调成为下一个微任务; - 不写
return或显式返回void→ 等价于返回undefined,新 Promise fulfilled,值为undefined。
错误传递与微任务顺序
reject 不会中断链,而是沿链向下“穿透”,直到遇到 catch 或双参数 then(onFulfilled, onRejected):
- 未处理的 rejection 会继续生成新的 rejected Promise,其
catch回调仍作为微任务,在当前微任务队列中排在同轮其他微任务之后; - 多个 Promise 并发时(如
Promise.all([p1, p2, p3])),各自 resolve/reject 触发的微任务按进入队列的顺序执行,不保证与创建顺序一致; -
catch捕获错误后若正常返回(无 throw),后续then会收到该返回值,并作为 fulfilled 微任务继续执行。
finally 的特殊性
finally 不接收值,也不改变 Promise 状态,但它本身也产生微任务:
- 无论前一个 Promise 是 fulfilled 还是 rejected,
finally回调都作为微任务执行; - 它不修改传递给下一个
then的值——原值或错误会原样透传; - 如果
finally中抛出错误,会覆盖前面的状态,使链后续走向 rejected 分支。


















