📜  Node.js 事件(1)

📅  最后修改于: 2023-12-03 14:44:42.278000             🧑  作者: Mango

Node.js 事件

Node.js 是一个基于事件驱动的 JavaScript 运行时,它提供了一个“事件循环”机制来处理异步任务。事件循环是 Node.js 的核心模块,被用于实现非阻塞 I/O 操作。

EventEmitter

在 Node.js 中,事件是通过 EventEmitter 类来实现的。EventEmitter 可以让开发者在对象上注册监听器,然后通过触发事件来调用这些监听器。

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('触发事件');
});
myEmitter.emit('event');

这段代码创建了一个自定义的 EventEmitter 对象,注册了一个事件监听器,并通过 emit 方法触发了这个事件。执行代码,控制台会打印出“触发事件”。

事件处理

通过 on 方法添加事件监听器,在事件被触发后,处理函数会按照添加的顺序依次执行。可以使用 addListener 方法来添加事件监听器。

myEmitter.on('event', function firstListener() {
  console.log('第一个监听器');
});
myEmitter.on('event', function secondListener() {
  console.log('第二个监听器');
});
myEmitter.emit('event');

执行这段代码,控制台会先打印“第一个监听器”,再打印“第二个监听器”。

可以使用 once 方法来添加一个一次性的事件监听器,它在第一次被触发后就会被自动移除。

myEmitter.once('event', () => {
  console.log('一次性事件');
});
myEmitter.emit('event');
myEmitter.emit('event');

执行这段代码时,控制台只会打印“一次性事件”一次。

异步事件

EventEmitter 支持异步事件,在处理函数中可以通过异步代码来执行事件处理。

myEmitter.on('event', (a, b) => {
  setImmediate(() => {
    console.log('异步事件', a, b);
  });
});
myEmitter.emit('event', '参数1', '参数2');

函数 setImmediate 会在当前事件循环终止后调度传入的回调函数,从而避免了同步代码阻塞事件循环的问题。

错误处理

在 EventEmitter 中,错误事件是一个特殊的事件类型。类似地,我们可以使用 ononce 方法来添加错误事件监听器。

myEmitter.on('error', (err) => {
  console.error('发生错误', err);
});
myEmitter.emit('error', new Error('错误信息'));

发生错误事件时,错误对象会被传递给监听器处理函数。

自定义事件符号

在 Node.js 中,可以使用 Symbol 类型的值作为自定义事件名称。这种方式可以避免事件名称冲突的问题。

const mySymbol = Symbol('myEvent');
myEmitter.on(mySymbol, () => {
  console.log('自定义事件');
});
myEmitter.emit(mySymbol);

以上就是 Node.js 事件的一些介绍和用法示例。更多信息可以参考官方文档:Events | Node.js Documentation