XHR属宏任务、Fetch属微任务是否属实?为何二者处理逻辑不同?
XHR与Fetch在事件循环中的任务队列差异解答
1. 结论是否属实?
- 确实是这样的。XHR的回调(比如
onload、onerror这类)会被放进宏任务队列;而Fetch的then()/catch()/finally()回调会被排入微任务队列。
2. 为什么会有这种差异?不该用相同的处理方式吗?
- 历史遗留因素:XHR是很早的异步网络API,它诞生的时候,浏览器事件循环里的微任务机制还没成熟,当时所有异步回调基本都走宏任务队列,这么做是为了兼容早期的浏览器运行逻辑。
- API设计的时代差异:Fetch是跟着ES6的Promise规范出来的现代API,Promise的回调本身就是微任务队列的核心内容。微任务会在当前宏任务干完之后立刻执行,不用等下一轮事件循环,能让异步结果处理得更及时,减少UI线程空等的时间,页面响应会更流畅。
- 适配现代异步生态:Fetch的设计就是为了更好地融入ES6+的异步体系(比如async/await),而async/await本质是Promise的语法糖,必须依赖微任务队列才能实现连贯的异步流程,所以Fetch用微任务队列是顺理成章的选择。
内容的提问来源于stack exchange,提问作者thecoder-elite
相关产品推荐
相关产品推荐

