微任务在事件处理链路后执行,是因为 javascript 引擎将宏任务队列和微任务队列分开管理。当当前宏任务(如点击事件回调)执行完毕后,引擎会清空整个微任务队列,然后才渲染页面并进入下一个宏任务。

为什么 setTimeout 比 Promise 慢
因为 setTimeout 是宏任务,而 Promise.then 是微任务。宏任务需要等待当前调用栈清空、甚至可能经过浏览器重绘,而微任务在当前宏任务结束后立即执行。

console.log('start');
setTimeout(() => {
console.log('timeout');
}, 0);
Promise.resolve().then(() => {
console.log('promise');
});
console.log('end');
输出顺序为:start -> end -> promise -> timeout。start 和 end 是同步代码,先执行。promise 是微任务,在当前脚本执行完后立即执行。timeout 是宏任务,排在最后。
立即学习“Java免费学习笔记(深入)”;
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
async/await 的执行时机
async/await 基于 Promise,因此 await 后面的代码也是微任务。它在当前宏任务中暂停执行,将后续代码放入微任务队列,等当前宏任务结束后再恢复执行。

async function asyncFunc() {
console.log('async start');
await new Promise(resolve => resolve());
console.log('async end');
}
console.log('script start');
asyncFunc();
console.log('script end');
输出顺序为:script start -> async start -> script end -> async end。async start 是同步代码,立即执行。await 挂起函数,将 async end 放入微任务队列。script end 继续执行。最后执行微任务 async end。
DOM 事件处理中的微任务
在 DOM 事件处理程序中,如果使用了 await 或 Promise.then,这些微任务会在事件处理程序执行完毕后、但页面渲染前执行。这意味着你可以更新 DOM,但不会立即触发重排或重绘,直到所有微任务完成。

















