一. Event Loop是什么
- 什么是Event
- 计时器到期了
- 文件可以读取了、读取出错了
- socket有内容了、关闭了,比如用户请求了服务器需要有一个操作系统告诉js的事件
- 一般分内部和外部事件,计时器就属于内部事件,文件读取属于外部事件,文件是在u盘等外面的设备
- 什么是Loop
- loop就是循环,比如while(true)循环
- 由于事件是分优先级的,所以处理起来也是分先后的
- 所以Node.js需要按顺序轮询每种事件
- 这种轮询往往都是循环的,1->2->3->1->2->3
- Event Loop
- 操作系统可以触发事件,JS可以处理事件
- Event Loop就是对事件处理顺序的管理
二. 不同事件先后顺序例子
- 三种不同的事件
setTimeOut(f1,100)
fs.readFile('/1.txt',f2)
server.on('close',f3)
- 如果同时触发,Node会怎么办
- 肯定会有某种顺序(优先级),比如先执行文件,再执行服务器关闭,再执行定时器。
- 这种顺序应该是人为规定的
三. Event Loop 详解
- 顺序示意图
- 重点阶段
- timers检查计时器
- poll轮询,检查系统事件
- check检查setImmediate回调
- 其他阶段用得较少
- 注意
- 大部分时间,Node.js都停在poll轮询阶段
- 大部分事件都在poll阶段被处理,如文件、网络请求等,文件和网络请求是不等人的,相比而言计时器可以稍等一会
- 面试题
setTimeout(f1, 0)
setImmediate(f2)
// 哪个先执行
// 大部分场景应该是setImmediate,因为loop是停留在poll阶段,下一步是check阶段,check阶段就是检查setImmediate回调
// 例外情况,就是初始化第一次的时候是先进timers此时setTimeout先执行
- 文章里面的例子可以用类似参考以下代码直接在浏览器里运行
function someAsyncOperation(callback) {
const startCallback = Date.now();
// 模拟读取这个文件一共花费 95 毫秒,
while (Date.now() - startCallback < 95) {
// 什么也不做
}
callback()
}
const timeoutScheduled = Date.now();
setTimeout(() => {
const delay = Date.now() - timeoutScheduled;
console.log(`${delay}毫秒后执行了 setTimeout 的回调`);
}, 100);
// 执行一个耗时 95 毫秒的异步操作
someAsyncOperation(() => {
const startCallback = Date.now();
// 执行一个耗时 2000 毫秒的同步操作
while (Date.now() - startCallback < 2000) {
}
});
// 最后打印:2095毫秒后执行了 setTimeout 的回调
四. node.js工作流程
- 如图,其中最主要的就是v8和libuv,以及中间的一些bindings,我们实际写的代码只有一小步部分
五. Node.js API
- API官方地址
- 英文文档nodejs.org/api
- 中文文档nodejs.cn/api
- 民间版本
- devdocs.io
- 进入之后开启Node.js10LTS
- 搜索功能非常方便
- 可开启暗黑主题
- 可离线观看
六. Node.js中大概有哪些API
- 重点关注黄色字体的部分
七. 学习路线
- 基础-Web-框架
- 先学基础,以任务为导向学习
- 逐个学习文件、HTTP、Stream等模块
- 再学Web,学习数据库、AJAX相关知识
- 最后学框架,以项目为导向学习
- 以Express为切入点,制作完整的网站
- 三个约定
- 希望大家记笔记,写博客
- CRM学习法贯穿整个学习过程
- 学习调试工具和思路
八. 如何记笔记
- 东京大学笔记法,详细记录关键信息、例子、思考,把自己要做的事情写下来。