node中事件循环

91 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第34天,点击查看活动详情

前言

学习nodejs 开发肯定离不开事件循环的学习。它是Node.js 执行非阻塞I/O操作。JavaScript引擎本身不实现事件循环机制。浏览器中的事件循环由浏览器实现的,NodeJS中事件循环主要是由底层Libuv库实现的。

执行过程

Libuv库是事件驱动的,其封装和统一了不同平台的API实现。NodeJS的跨平台和事件循环机制都是通过Libuv库实现的。

基本执行过程是:

1、NodeJS的V8引擎解析JavaScript代码,然后调用Node API

2、NodeAPI将任务分配给Libuv库处理,

3、Libuv中通过事件循环机制管理这些任务的执行,处理结束后将结果返回给V8引擎。

4、V8引擎回调处理Libuv返回

事件循环各阶段

  • timers阶段:执行所有setTimeout和setInterval的回调
  • pendding callback阶段:某些系统操作的回调。如TCP连接的错误
  • poll阶段:轮询等待新的链接和请求等事件,执行I/O回调。比如:文件读取操作
  • check阶段:执行setImmedidate的回调
  • close callback阶段:关闭回调执行,如socket.on(close...)

每个阶段都会执行当前阶段的任务队列,然后再执行当前阶段的微任务队列,只有执行完所有微任务才进行入下一阶。

微任务与宏任务

事件循环的过程中会根据任务种类,划分不同的任务队列,微任务队列和宏任务队列。

  • 宏任务:setTimeout、setInterval、setImmediate
  • 微任务:promise.then()、promise.catch()、process.nextTick()

浏览器中事件循环区别:

  • 浏览器中没有分多个阶段;优先级别:同步代码,微任务,宏任务
  • 浏览器中,宏任务可能会有多个队列,但是微任务只有一个,每次都会先执行完微任务再执行宏任务