微任务在事件处理流程后执行,是因为 javascript 引擎将宏任务队列和微任务队列分开管理,并在每个宏任务(如脚本主代码、定时器回调)结束后清空微任务队列。具体做法是:当宏任务执行完毕时,引擎会检查微任务队列,将所有待处理的微任务按顺序执行,直到队列为空,然后再进行 ui 渲染或进入下一个宏任务。

setTimeout与Promise.then的执行顺序差异
在同一个宏任务中,setTimeout注册的回调会被放入宏任务队列,而Promise.then注册的回调会被放入微任务队列。因此,即使setTimeout的延迟时间设为0,其回调也会在Promise.then之后执行。这是因为Promise.then属于微任务,会在当前宏任务结束前被优先执行。

console.log('start');
setTimeout(() => {
console.log('timeout');
}, 0);
Promise.resolve().then(() => {
console.log('promise');
});
console.log('end');预期输出:startendpromisetimeout
立即学习“Java免费学习笔记(深入)”;
异步操作中的微任务调度机制
在异步操作中,微任务的调度发生在所有同步代码执行完毕后。例如,在fetch请求完成后,其回调函数中的Promise.then会被加入微任务队列,并在当前调用栈清空后立即执行。这种机制确保了微任务能够在不阻塞 UI 渲染的前提下,快速响应异步事件。

async function fetchData() {
const response = await fetch('/api/data');
const data = await response.json();
console.log(data);
}
fetchData();
console.log('after fetch call');预期输出:after fetch call
(等待网络响应)
(数据解析完成后){...}
微任务队列满时的行为表现
当微任务队列中存在大量任务时,JavaScript 引擎会持续执行这些任务,直到队列为空。这意味着如果某个微任务又产生了新的微任务,这些新任务也会被立即执行,可能导致长时间的计算阻塞。开发者应避免在微任务中执行耗时操作,以防止影响页面的响应性。


















