当前位置: 首页 > news >正文

【八股系列】分别说一下nodeJS和浏览器的事件循环机制?

文章目录

  • 1. NodeJS
    • 1.1 Node.js 事件循环概念
    • 1.2 Node.js 事件循环工作流程
    • 1.3 Node.js 事件循环示例
  • 2. 浏览器
    • 2.1 浏览器事件循环概念
    • 2.2 浏览器事件循环工作流程
    • 2.3 浏览器事件循环示例

1. NodeJS

1.1 Node.js 事件循环概念

Node.js 中,事件循环libuv 库实现,它是跨平台的,可以让 Node.js 高效地处理非阻塞 I/O 操作。

1.2 Node.js 事件循环工作流程

事件循环的工作流程如下

步骤描述
1事件循环开始 (Start)
2执行同步任务 (Sync Tasks) 并将它们添加到调用栈 (Call Stack)
3检查宏任务 (Check Macro Tasks) 并将它们添加到宏任务队列 (Macro Tasks Queue)
4执行宏任务 (Execute Macro Tasks)
5检查微任务 (Check Micro Tasks) 并将它们添加到微任务队列 (Micro Tasks Queue)
6执行微任务 (Execute Micro Tasks)
7再次检查宏任务 (Check Macro Tasks) 并循环执行上述步骤直到所有任务执行完毕
8事件循环结束 (End)

1.3 Node.js 事件循环示例

console.log('Start');setTimeout(() => {console.log('setTimeout');
}, 0);setImmediate(() => {console.log('setImmediate');
});Promise.resolve().then(() => {console.log('Promise');
});process.nextTick(() => {console.log('nextTick');
});console.log('End');// 输出:
// Start
// End
// nextTick
// Promise
// setTimeout
// setImmediate

2. 浏览器

2.1 浏览器事件循环概念

浏览器中,事件循环由 JavaScript 引擎(如 V8)和 Web APIs 共同实现。

2.2 浏览器事件循环工作流程

事件循环的工作流程与 Node.js 类似,但有一些细节有所不同:

步骤描述
1事件循环开始 (Start)
2执行同步任务 (Sync Tasks) 并将它们添加到调用栈 (Call Stack)
3检查宏任务 (Check Macro Tasks) 并将它们添加到宏任务队列 (Macro Tasks Queue)
4执行宏任务 (Execute Macro Tasks)
5检查微任务 (Check Micro Tasks) 并将它们添加到微任务队列 (Micro Tasks Queue)
6执行微任务 (Execute Micro Tasks)
7再次检查宏任务 (Check Macro Tasks) 并循环执行上述步骤直到所有任务执行完毕
8事件循环检查是否有任何 Web APIs 任务需要执行 (如 DOM 事件、fetch 请求)
9如果有 Web APIs 任务需要执行,将它们添加到任务队列 (Task Queue) 并执行
10事件循环检查是否有任何 I/O 操作完成
11如果有 I/O 操作完成,将它们添加到任务队列 (Task Queue) 并执行
12事件循环检查是否有任何 setImmediate 任务需要执行
13如果有 setImmediate 任务需要执行,将它们添加到任务队列 (Task Queue) 并执行
14事件循环检查是否有任何任务需要执行 (包括宏任务、微任务、Web APIs 任务、I/O 操作完成的任务、setImmediate 任务)
15如果有任务需要执行,将它们从任务队列中取出并执行
16事件循环结束 (End)

2.3 浏览器事件循环示例

console.log('Start');setTimeout(() => {console.log('setTimeout');
}, 0);document.addEventListener('DOMContentLoaded', () => {console.log('DOMContentLoaded');
});Promise.resolve().then(() => {console.log('Promise');
});requestAnimationFrame(() => {console.log('requestAnimationFrame');
});console.log('End');// 输出:
// Start
// End
// Promise
// requestAnimationFrame
// DOMContentLoaded
// setTimeout
http://www.lryc.cn/news/351317.html

相关文章:

  • 关于基础的流量分析(1)
  • 数据结构---树,二叉树的简单概念介绍、堆和堆排序
  • MySQL聚合函数(多行函数)
  • 智慧教室课堂-专注度及考试作弊系统、课堂动态点名,情绪识别、表情识别和人脸识别结合
  • 单例模式简要介绍
  • 深度学习面试问题总结(21)| 模型优化
  • 4月手机行业线上市场销售数据分析
  • 首都师范大学聘请旅美经济学家向凌云为客座教授
  • 多电脑共享鼠标键盘
  • 展厅设计对企业有哪些作用
  • LeetCode-102. 二叉树的层序遍历【树 广度优先搜索 二叉树】
  • 基于时频模糊算子的数据增强方法
  • 浅谈后端整合Springboot框架后操作基础配置
  • 英码科技算能系列边缘计算盒子再添新成员!搭载TPU处理器BM1688CV186AH,功耗更低、接口更丰富
  • selenium 爬取今日头条
  • docker 安装 yapi
  • 【AI如何帮你编写测试用例并输出表格格式】
  • 九宫格转圈圈抽奖活动,有加速,减速效果
  • 利用阿里OSS服务给文件设置过期删除--简单版
  • LabVIEW控制Trio控制器
  • 02--大数据Hadoop集群实战
  • 【ARMv8/v9 异常模型入门及渐进 10 -- WFI 与 WFE 使用详细介绍 1】
  • @DateTimeFormat 和 @JsonFormat 的区别和使用方式
  • C++—结构体
  • 指针与引用
  • 使用 mysql-binlog-connector 监听处理 MySQLBinlog 文件
  • CF Div2 729 Plus and Multiply
  • Joomla 3.7.0 (CVE-2017-8917) SQL注入漏洞环境
  • Python高克勒-曼宁-斯特里克勒公式计算一维流量
  • 【GD32系列--基本定时器Timer + 定时1ms 灯光间隔1s闪烁例程】