Node.js 的事件循环是其非阻塞 I/O 模型的核心,它允许 Node.js 在单线程上处理大量并发操作。事件循环不断地检查事件队列,处理事件,执行回调函数,并且是异步编程的基础。
Node.js 中的事件循环大致分为以下几个阶段:
- 定时器(Timers):检查并执行 setTimeout 和 setInterval 的回调。
- I/O 事件(I/O Events):包括网络请求、文件系统操作等,处理非阻塞的 I/O 事件。
- 立即执行回调(Immediate Callbacks):通过 process.nextTick() 和 setImmediate() 调度的回调函数。
- 关闭的回调函数(Close Callbacks):如 socket.on('close', ...) 等,处理一些资源的清理工作。
下面是一个简单的 Node.js 事件驱动程序的示例,它展示了如何使用 events
模块中的 EventEmitter
类来创建自定义事件和监听器:
// 引入 events 模块
var events = require('events');
// 创建一个 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
// 定义一个事件处理程序
var connectHandler = function connected() {
console.log('连接成功。');
// 在连接成功后触发 'data_received' 事件
eventEmitter.emit('data_received');
};
// 绑定 'connection' 事件到 connectHandler 处理程序
eventEmitter.on('connection', connectHandler);
// 定义另一个事件处理程序,用于处理 'data_received' 事件
eventEmitter.on('data_received', function() {
console.log('数据接收成功。');
});
// 触发 'connection' 事件
eventEmitter.emit('connection');
console.log("程序执行完毕。");
在这个例子中,我们首先引入了 events
模块,并创建了一个 EventEmitter
对象。然后我们定义了一个名为 connectHandler
的函数,它会在触发 'connection' 事件时被调用,并打印 "连接成功。" 到控制台。在 connectHandler
函数内部,我们又触发了另一个名为 'data_received' 的事件。