微任务在事件循环中是在当前宏任务执行完毕后、下一次ui渲染前执行的。具体做法是调用 promise.then、queuemicrotask 或 mutationobserver 来创建微任务,它们会被推入微任务队列。当 javascript 引擎完成一个宏任务(如点击事件或定时器)后,会清空整个微任务队列,然后才继续下一个宏任务。

如何确保代码在 DOM 更新后执行
使用 MutationObserver 监听 DOM 变化,其回调函数作为微任务执行,保证在浏览器重绘前运行。这比 setTimeout 更可靠,因为 setTimeout 至少延迟 4ms 且受主线程阻塞影响。

const observer = new MutationObserver((mutations) => {
console.log('DOM changed');
});
observer.observe(document.body, { childList: true });
document.body.appendChild(document.createElement('div'));
预期结果:控制台立即输出 'DOM changed',且在页面视觉更新前触发。
Promise 链中的执行顺序是怎样的
Promise.then 的回调总是作为微任务排队。即使 Promise 已经 resolve,.then 中的代码也不会同步执行,而是进入微任务队列。这确保了异步操作的解耦和顺序执行。

console.log('Start');
Promise.resolve().then(() => console.log('Microtask 1'));
console.log('End');
预期结果:控制台依次输出 'Start'、'End'、'Microtask 1'。
微任务队列耗尽时会发生什么
如果微任务队列中不断产生新的微任务,事件循环会持续处理它们,直到队列为空。这意味着新创建的微任务会推迟 UI 渲染和后续宏任务的执行,可能导致页面响应变慢。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











