📅  最后修改于: 2023-12-03 14:44:42.278000             🧑  作者: Mango
Node.js 是一个基于事件驱动的 JavaScript 运行时,它提供了一个“事件循环”机制来处理异步任务。事件循环是 Node.js 的核心模块,被用于实现非阻塞 I/O 操作。
在 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 中,错误事件是一个特殊的事件类型。类似地,我们可以使用 on
或 once
方法来添加错误事件监听器。
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。