微任务优先于宏任务执行:事件循环先执行宏任务,完成后清空微任务队列,再进入下一宏任务;fetch回调属微任务,XHR和WebSocket消息回调属宏任务。

网络响应事件(如 fetch、XMLHttpRequest、WebSocket 消息)在 JavaScript 中**不直接进入宏任务队列**,而是由浏览器底层网络层触发后,以 **微任务(microtask)或宏任务(macrotask)形式排队**,具体取决于 API 实现和响应时机。
fetch 响应走的是微任务链
fetch() 本身是异步的,但它的 .then() 或 await 回调属于 Promise 链——而 Promise 的回调总是作为**微任务**执行。这意味着:
- 即使网络响应很快(比如本地 mock),只要用
fetch().then(...),回调一定在当前同步代码和本轮宏任务结束后、下一轮宏任务开始前执行; - 多个
fetch的.then会按响应完成顺序排队进微任务队列,但不会插队已开始执行的宏任务(如setTimeout回调); - 注意:
fetch()发起是同步的(返回 Promise),但响应处理完全异步,且不阻塞主线程。
XMLHttpRequest 的 onreadystatechange 是宏任务
XMLHttpRequest 的 onload 或 onreadystatechange 回调被浏览器视为**事件回调(event handler)**,归类为宏任务(类似 click、setTimeout)。所以:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 响应到达后,浏览器将回调推入宏任务队列,等待当前调用栈清空 + 所有微任务执行完毕后再执行;
- 它和
setTimeout(fn, 0)处于同一优先级层级,可能被后续加入的微任务“抢跑”; - 如果同时有
fetch().then()和XHR.onload响应就绪,通常fetch的回调先执行。
WebSocket 消息事件也是宏任务
WebSocket 的 onmessage 回调属于 DOM 事件机制,浏览器将其作为**宏任务调度**。特点包括:
立即学习“Java免费学习笔记(深入)”;
- 每收到一帧消息,就向宏任务队列推一个任务;
- 消息处理是串行的:前一个
onmessage回调没执行完,下一个不会开始; - 若消息高频到达,可能堆积宏任务,造成延迟或卡顿,建议在回调内做防抖、批处理或移交到
requestIdleCallback。
实际调试时怎么看?
可以用 console.log + 标记 + 浏览器 DevTools 的 Event Log(在 Rendering > Paint Flashing 关闭时,启用 Performance 面板录制,查看 Task、Microtask 时间戳)来验证执行顺序。简单判断法:
- 用
Promise.resolve().then(() => console.log('micro'))对比setTimeout(() => console.log('macro'), 0),再插入fetch或XHR,观察打印顺序; - 注意:Node.js 环境无原生
fetch或XHR,其 HTTP 客户端(如node-fetch)基于process.nextTick或Promise,也走微任务。

















