理解JS事件环(Event Loop)

事件环(Event Loop)

任务分类

  • 宏任务:

    • 脚本执行(顺序执行)
    • UI 渲染
    • 定时器(setTimeout)
    • HTTP 请求
    • 事件处理
    • MessageChannel
    • setImmediate
  • 微任务:

    • Promise.then
    • MutationObserver
    • process.nextTick
    • queueMicrotask

执行顺序

  1. 执行一个宏任务
  2. 清空微任务队列
  3. 重复步骤 1 和 2

微任务与宏任务执行顺序示例

javascript 复制代码
console.log(1);
async function async() {
  console.log(2);
  await console.log(3); // 相当于 Promise.resolve(console.log(3)).then(()=>{console.log(4)})
  console.log(4); // 也会产生一个 then,在之后执行
}
setTimeout(() => {
  console.log(5);
}, 0);
const promise = new Promise((resolve, reject) => {
  console.log(6);
  resolve(7);
});
promise.then((res) => {
  console.log(res);
});
async();
console.log(8);

执行顺序分析

  1. 同步代码执行:

    • console.log(1) → 输出 1
    • console.log(6) → 输出 6(Promise 构造函数中的同步代码)
    • console.log(2) → 输出 2(async 函数开始执行)
    • console.log(3) → 输出 3(await 后面的同步代码)
    • console.log(8) → 输出 8
  2. 微任务队列:

    • Promise.then 回调(输出 7)
    • async 函数中 await 后的代码(输出 4)
  3. 宏任务队列:

    • setTimeout 回调(输出 5)

最终输出顺序

复制代码
1
6
2
3
8
7
4
5

执行过程详解

  1. 首先执行所有同步代码(1, 6, 2, 3, 8)
  2. 然后清空微任务队列:
    • 执行 Promise.then 回调(7)
    • 执行 async 函数中 await 后的代码(4)
  3. 最后执行宏任务队列中的 setTimeout 回调(5)

关键点说明

  • async/await 本质上是 Promise 的语法糖
  • await 后面的代码会被包装成 Promise.then 回调
  • 微任务优先于宏任务执行
  • 同步代码优先于异步代码执行
  • Promise 构造函数中的代码是同步执行的
  • setTimeout 是宏任务,即使延迟时间为 0

其他重要概念

  • requestAnimationFrame:用于优化动画
  • requestIdleCallback:用于空闲时间任务调度
  • 进程间通信(IPC):多进程间通信机制
相关推荐
叼烟扛炮1 小时前
[LangChain] 学习笔记(03):打破失忆症——对话机制与上下文管理
java·前端·javascript·笔记·学习·langchain
卋罖7502 小时前
Razor 视图 + JavaScript + Vue/iView 组件实现的表格自定义列
javascript·vue·iview·razor视图
IT_陈寒3 小时前
SpringBoot实战技巧总结
前端·人工智能·后端
TeamDev3 小时前
使用 JxBrowser 在桌面应用中集成 Spring
java·前端·后端·spring·混合应用·jxbrowser·浏览器控件
陈随易4 小时前
Rolldown 把插件改动回传提速 26 倍
前端·后端·程序员
笃行35011 小时前
集中式与分布式,KingbaseES 的四种形态共用一套内核
前端
陈随易13 小时前
Vue 编译器换掉 source map,快了三四成
前端·后端·程序员
ZhengEnCi14 小时前
12 种高级 UI 交互效果及对应 AI 提示词:从按压回弹到底部抽屉的物理感教学
前端·css·交互设计
IT_陈寒17 小时前
Redis大key删除为什么会导致服务卡顿?我的线上事故复盘
前端·人工智能·后端
系统集成-鹰翔17 小时前
ERP图片改名后仍命中识别缓存:缓存键、十分钟到期与调用计数
javascript·经验分享·后端