javascript中事件循环是什么_它如何管理异步任务?
发布时间 - 2026-01-12 00:00:00 点击率:次事件循环由宿主环境实现,JavaScript引擎只负责同步执行与调用栈;其核心是“轮询—清空微任务队列—执行宏任务”的严格顺序,宏任务包括setTimeout等,微任务包括Promise.then等,且Node.js与浏览器实现存在阶段差异。
事件循环不是 JavaScript 引擎自己写的代码
它是由宿主环境(比如浏览器或 Node.js)实现的运行时机制,JavaScript 引擎本身只负责执行同步代码和维护调用栈。你写的 setTimeout、Promise.then、fetch 这些异步操作,最终都依赖宿主环境把回调“塞进”事件循环的对应队列里。
关键点在于:事件循环不“主动调度”,它只是不断轮询——检查调用栈是否为空,如果空了,就从任务队列里取一个最老的任务执行。
宏任务和微任务队列必须分清
宏任务(macrotask)包括:setTimeout、setInterval、I/O、UI 渲染;微任务(microtask)包括:Promise.then/catch/finally、MutationObserver、queueMicrotask。
执行顺序严格是:一次宏任务 → 清空全部当前微任务队列 → 下一次宏任务。这意味着哪怕你在 setTimeout 回调里又 Promise.resolve().then(...),那个 then 也会在下一轮宏任务之前执行。
console.log(1); setTimeout(() =>console.log(2), 0); Promise.resolve().then(() => console.log(3)); console.log(4); // 输出:1 → 4 → 3 → 2
async/await 只是 Promise 的语法糖,不改变队列本质
await 后面的表达式一旦返回的是 Promise,函数就会暂停,并把后续代码包装成微任务推入微任务队列。它不会让出线程,也不会变成宏任务。
-
await不等于 “等一会儿”,而是“等这个 Promise settle 后,把剩下逻辑作为微任务排队” - 连续多个
await不会插入宏任务间隙,除非你显式用了setTimeout或类似 API -
await Promise.resolve()和await Promise.reject()都立即进入微任务队列,区别只在错误是否被catch
Node.js 和浏览器的事件循环阶段有差异
浏览器事件循环相对简化,而 Node.js 的 libuv 实现了更细粒度的阶段划分:timers → pending callbacks → idle/prepare → poll → check → close callbacks。其中 setImmediate 属于 check 阶段,setTimeout(fn, 0) 属于 timers 阶段,二者执行顺序并不总是一致。
常见陷阱:
- 在 Node.js 中,
setTimeout(fn, 0)和setImmediate(fn)谁先执行,取决于进入事件循环 poll 阶段时是否有 I/O 回调待处理 -
process.nextTick()比所有微任务还优先,它会在当前操作结束后、任何微任务前执行,但滥用会导致 I/O 饥饿 - 浏览器没有
setImmediate和nextTick,别直接照搬 Node.js 代码
Promise.all 或 Web Worker 的误用。
# javascript
# java
# js
# node.js
# node
# 浏览器
# mac
# 栈
# ai
# 异步任务
# 区别
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Python制作简易注册登录系统
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
长沙企业网站制作哪家好,长沙水业集团官方网站?
中山网站推广排名,中山信息港登录入口?
太平洋网站制作公司,网络用语太平洋是什么意思?
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
如何快速建站并高效导出源代码?
开心动漫网站制作软件下载,十分开心动画为何停播?
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
JS去除重复并统计数量的实现方法
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
如何实现建站之星域名转发设置?
5种Android数据存储方式汇总
JavaScript数据类型有哪些_如何准确判断一个变量的类型
如何在VPS电脑上快速搭建网站?
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
如何用腾讯建站主机快速创建免费网站?
详解vue.js组件化开发实践
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
如何快速搭建FTP站点实现文件共享?
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
如何选择可靠的免备案建站服务器?
java ZXing生成二维码及条码实例分享
EditPlus中的正则表达式 实战(4)
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
C语言设计一个闪闪的圣诞树
如何用低价快速搭建高质量网站?
免费视频制作网站,更新又快又好的免费电影网站?
Laravel如何实现模型的全局作用域?(Global Scope示例)
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
BootStrap整体框架之基础布局组件
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
Laravel如何与Pusher实现实时通信?(WebSocket示例)
EditPlus 正则表达式 实战(3)
如何快速辨别茅台真假?关键步骤解析
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
教你用AI润色文章,让你的文字表达更专业
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
Laravel观察者模式如何使用_Laravel Model Observer配置
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
linux top下的 minerd 木马清除方法
Laravel如何使用.env文件管理环境变量?(最佳实践)
如何在阿里云虚拟服务器快速搭建网站?
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】


console.log(2), 0);
Promise.resolve().then(() => console.log(3));
console.log(4);
// 输出:1 → 4 → 3 → 2