news 2026/6/9 23:33:21

JS事件循环Event Loop详解:为什么setTimeout不准?Promise和Axios执行顺序拆解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JS事件循环Event Loop详解:为什么setTimeout不准?Promise和Axios执行顺序拆解

打破直觉:从浏览器宿主环境视角,彻底看清宏微任务的调度真相

前言

在前端面试或大型项目开发中,异步执行机制是一个避不开的核心话题。许多初学者甚至有经验的开发者,在面对嵌套的setTimeoutPromise以及网络请求时,往往只能凭直觉判断执行顺序。本文将基于底层逻辑,通过模拟浏览器宿主环境与 JS 引擎的协作过程,彻底拆解事件循环(Event Loop)的运作本质。


一、 核心架构:三位一体的协作模型

要理解异步,首先要意识到浏览器并非只有一个线程在工作。虽然JavaScript 引擎(如 V8)是单线程的,但浏览器作为宿主环境是多线程的。

  1. 执行栈 (Call Stack):负责运行同步代码。
  2. Web APIs (宿主环境助手):包含定时器线程、网络请求线程、事件触发线程。它们负责在后台处理耗时任务。
  3. 任务队列 (Task Queues):用于存放异步任务的回调函数,分为宏任务队列(Macrotask Queue)和微任务队列(Microtask Queue)。
任务分类速查表
任务类型来源具体 API 示例
宏任务 (Macrotask)宿主环境script全体代码、setTimeoutsetInterval、I/O、UI 渲染
微任务 (Microtask)JS 引擎内部Promise.then/catch/finallyMutationObserverprocess.nextTick(Node.js)

二、 执行流程详解:以 Axios 和 Timer 为例

假设我们有如下代码片段:

console.log("0");axios.get("/api/data").then((res)=>{console.log("res");});setTimeout(()=>{console.log("1");},1000);console.log("2");
1. 初始化与同步阶段

当代码开始执行时,它本身处于第一个宏任务(Script)中。

  • console.log("0")入栈执行,打印0,出栈。
  • 执行axios.get:JS 引擎调用网络模块接口后立即出栈。注意:此时回调函数并没有进入队列,而是由浏览器的网络线程接管。
  • 执行setTimeout:JS 引擎通知定时器线程开始 1000ms 倒计时,随后立即出栈。
  • console.log("2")入栈执行,打印2,出栈。
2. 异步协作与入队
  • 300ms 时:假设网络请求完成。网络线程将then中的回调函数放入微任务队列
  • 1000ms 时:定时器倒计时结束。定时器线程将回调函数放入宏任务队列
3. 事件循环的搬运规则

当执行栈为空时,Event Loop 开始循环工作:


三、 关键机制补丁:深度问答

1. 任务队列为空时会发生什么?

当执行栈和所有任务队列均为空时,主线程并不会进行无效的死循环(空转)。此时主线程会进入“挂起”状态,由操作系统接管,直到 Web APIs 线程产生新的任务信号(如用户点击、定时器到期)将其唤醒。这种机制极大地降低了能耗。

2. 为什么定时器不准?

setTimeout(fn, 1000)的含义是:“在 1000ms 后,将 fn 加入宏任务队列”
如果此时执行栈正在处理一个耗时 2000ms 的同步计算,或者微任务队列中积压了大量任务,Event Loop 必须等前面的任务全部执行完,才有机会处理定时器的回调。因此,定时器的实际执行时间往往晚于预设时间。

3. 微任务的插队特性

微任务具有极高的优先级。在执行任何一个宏任务之前,Event Loop 必须确保微任务队列是空的。这意味着,如果在执行微任务的过程中又产生了新的微任务,这些新任务会直接排在当前微任务队列的末尾,并在同一个循环周期内被执行完,直到队列彻底清空。


四、 总结

理解 JavaScript 事件循环,关键在于摒弃“代码是一行行执行到底”的线性思维,转而建立“任务调度”的空间思维。

  • 同步代码:立即在栈中执行。
  • 异步发起:由宿主环境线程异步接管。
  • 异步回调:根据类型进入微/宏任务队列。
  • 事件循环:负责在栈空闲时,按照“先微后宏”的顺序进行搬运。

通过这一套机制,JavaScript 在单线程的基础上,优雅地实现了对高并发 I/O 和复杂交互的支持。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 20:55:49

Web自动化测试知识总结

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、自动化测试基本介绍 1、自动化测试概述: 什么是自动化测试?一般说来所有能替代人工测试的方式都属于自动化测试,即通过工…

作者头像 李华
网站建设 2026/6/6 12:07:36

Selenium自动化测试入门篇

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。 Selenium是用于自动化控制浏览器做各种…

作者头像 李华
网站建设 2026/6/5 10:49:07

广东佛山国际陆港调研考察-万祥军| 国研智库·中国国政研究

广东佛山国际陆港调研考察-万祥军| 国研智库中国国政研究 2026年1月8日,国务院总理在佛山国际陆港调研时,重点考察了跨境电商与保税物流的发展运营情况。这座位于粤港澳大湾区核心地带的现代化物流枢纽,正以日均处理超50万单跨境电商货物的规…

作者头像 李华
网站建设 2026/6/5 10:09:17

邮轮母港直升机场和机器人谷考察-万祥军| 国研智库·中国国政研究

邮轮母港直升机场和机器人谷考察-万祥军| 国研智库中国国政研究 2026年1月15日,国务院总理来到深圳蛇口邮轮母港直升机场和机器人谷,深入调研低空经济发展及科技创新成果。国际科学院组织代表兼国际科学院委员会执委万祥军解读表明:“此次考…

作者头像 李华
网站建设 2026/6/9 21:21:04

告别中心化平台:Peersuite 开源协作系统搭建教程

如果你在小团队协作或长期项目合作中待过一段时间,大概率会有这些真实感受: 🤝 协作工具越来越多,但数据越来越分散 😵 项目、讨论、文件被锁在不同平台里 🧠 平台规则一变,使用方式就被迫跟着变 🔒 对核心数据的控制权不在自己手里 💻 有些项目,其实并不需要“…

作者头像 李华
网站建设 2026/6/9 23:15:48

如何编写一份完整的软件测试报告?

背景 作为测试从业者,编写测试用例,测试计划,测试报告都是必经之路,最近完成了年终述职以及版本准出,感觉测试报告或者各类报告真是职场人不可或缺的一项技能,趁着热乎劲🔥,写下一些…

作者头像 李华