Node.js 事件循环学习笔记

1. 什么是事件循环?

事件循环是Node.js中非常重要的机制之一,它使得Node.js可以实现异步I/O操作,同时不会阻塞线程。

2. 事件循环的工作原理是什么?

事件循环的工作原理可以用以下步骤来概括:

  1. Node.js启动时会创建一个事件循环并开始工作。
  2. Node.js会从事件队列中取出第一个事件并执行它。
  3. 如果事件被标记为需要异步处理,Node.js会将其交给libuv库来处理。
  4. 当libuv执行异步操作完成后,它会将事件添加到事件队列中。
  5. Node.js会继续从事件队列中取出下一个事件并执行它。
  6. 如果事件队列为空,事件循环会等待新的事件加入。

3. 事件的分类有哪些?

Node.js中的事件大致可以分为以下几类:

  1. I/O事件:例如网络请求、文件读写等操作。
  2. 定时器事件:例如setTimeout()和setInterval()函数。
  3. 微任务事件:例如Promise回调函数和process.nextTick()函数。
  4. 自定义事件:用户可以使用EventEmitter类自定义事件。

4. 给出一个事件循环的例子

javascriptCopy Code
const fs = require('fs'); console.log('start'); fs.readFile('./file.txt', (err, data) => { if (err) { throw err; } console.log(data.toString()); }); setTimeout(() => { console.log('timeout'); }, 0); setImmediate(() => { console.log('immediate'); }); process.nextTick(() => { console.log('nextTick'); }); console.log('end');

这段代码中,我们读取了一个文件并设置了定时器、微任务和自定义事件。运行代码后,输出结果为:

Copy Code
start end nextTick immediate Hello, world! timeout

我们可以看到,虽然文件读取操作需要一定的时间,但这并没有阻塞后续代码的执行。另外,我们也可以观察到异步I/O操作、定时器事件、微任务事件和自定义事件的不同执行顺序。