Node.js 事件发射器
结论
Node 的事件驱动架构允许我们在事件发生时执行某些操作。这通过对象(称为“发射器”)实现,这些对象可以发出命名事件,从而触发函数(称为“监听器”)的执行。发出事件的对象是 Node 的 EventEmitter 类的实例,可通过 Node 模块获取events
。本文将介绍 Node 的事件发射器。
创建发射器
让我们创建一个事件来探索 Node 的 EventEmitter 的一些基本概念
// Require in the events module
const EventEmitter = require('events');
const carEvent = new EventEmitter();
该events
模块为我们提供了该类。然后我们创建一个calledEventEmitter
的实例。现在让我们探索一下它可用的一些方法。EventEmitter
carEvent
添加监听器
如前所述,监听器是当我们发出指定事件时执行的回调函数。以下是如何在carEvent
发射器上创建事件监听器的方法。
carEvent.on('start', function(){
console.log('Started the car.');
});
这里我们注册了一个名为start的事件监听器。当我们触发同名事件时,监听器就会执行。
我们还可以给单个事件添加多个监听器。让我们再添加一个:
carEvent.on('start', function(){
console.log('Car started. Ready to go!');
});
接下来我们将发出事件来触发这些监听器。
发出事件
事件的所有监听器将按照注册的顺序同步调用。
emit()
我们通过调用该方法并传入事件名称作为第一个参数来触发事件的监听器。后续参数都将作为参数传递给监听器。
carEvent.emit('start', 'Hello! ');
// Started the car.
// Car started. Ready to go!
上面我们触发了start事件,导致所有附加到该事件的监听器都被执行。现在让我们更新第二个监听器,使其接受一个参数。
carEvent.on('start', function(greeting){
console.log(greeting, 'Car started. Ready to go!');
});
现在我们发出开始事件并得到以下内容:
carEvent.emit('start', 'Hello!');
// Started the car.
// Hello! Car started. Ready to go!
从事件中删除监听器
该removeListener()
方法用于从事件中移除一个监听器。该方法接收事件名称和待移除的处理函数作为参数。调用此方法只会移除一个监听器实例,因此如果您多次添加了一个监听器,则需要removeListener()
多次调用该方法才能移除每个监听器。
function a(){
console.log('Called listener function');
}
// Add listener to event
carEvent.on('A', a);
// Emit event
carEvent.emit('A');
// Called listener function
// Remove listener
carEvent.removeListener('A', a);
// Emit event again
// Nothing happens, event was removed
carEvent.emit('A');
在监听器被移除后,该removeListener
方法会发出一个事件。removeListener
更多方法
在 Node 中使用事件发射器时,最常用的是和on()
方法emit()
。不过,我们来看看其他一些有用的方法。
一次
该once()
方法添加了一个只会执行一次(您猜对了:))的监听器。
// Adds a listener to be executed once
carEvent.once('stop', function(message){
console.log(message);
});
现在,当发出停止事件时,节点将删除监听器(从附加到事件的监听器列表中),然后调用它。
// Executes the first time we emit the stop event
carEvent.emit('stop', 'Stopping....');
// Stopping....
// Emit the stop event a second time
// Nothing happens
carEvent.emit('stop', 'Stopping....');
设置最大监听器
该setMaxListeners()
方法允许您设置可附加到单个事件的最大监听器数量。该值可以设置为 Infinity
(或 0
),以表示监听器数量不受限制。
// Sets a maximum of two listeners for any event on the carEvent emitter
carEvent.setMaxListeners(2);
如果我们向任何事件添加两个以上的监听器,那么我们将收到如下警告:
// Add thre listeners to a single event
carEvent.on('eventA', function(greeting){});
carEvent.on('eventA', function(greeting){});
carEvent.on('eventA', function(greeting){});
(node:17787) 警告:检测到 EventEmitter 可能存在内存泄漏。已添加 3 个 eventA 监听器。请使用 emitter.setMaxListeners() 来增加上限
听众
该listeners()
方法返回为某个事件注册的监听器数组。
const listeners = carEvent.listeners('start');
console.log(listeners);
// [ [Function], [Function] ]
事件名称
返回一个数组,列出发射器已注册侦听器的事件的名称。
console.log(carEvent.eventNames());
// [ 'start', 'stop', 'eventA' ]
扩展 EventEmitter 类
我们可以创建自己的对象,它具有自己的一组属性和方法以及节点提供的属性和方法EventEmitter
。
const EventEmitter = require('events');
class Car extends EventEmitter{
constructor(brand, year){
super();
this.brand = brand;
this.year = year;
}
turnRadioOn(){
console.log('radio turned on');
}
}
上面我们创建了一个从该类继承的类,EventEmitter
并且它有自己的两个属性(品牌和年份)以及一个方法turnRadioOn。
现在,类的实例Car
将可以访问类上的属性和方法Car
以及从EventEmitter
类继承的所有属性和方法。
const car = new Car('BMW', '2021');
// Adds a listener
car.on('start', function(){ console.log(this.brand + ' started') });
// Emit the event
car.emit('start');
// BMW started
// Call method defined on Car class
car.turnRadioOn();
// radio turned on
结论
Node 的 EventEmitter 允许我们创建带有监听器的对象,当我们触发监听器注册的事件时,这些监听器就会执行。
我们介绍了包括on()
、emit()
、方法在内的方法。我们还学习了如何在创建自己的类时removeListener()
扩展。EventEmitter
你觉得这有用吗?欢迎留言告诉我。下次再见,思考、学习、创造、重复!
文章来源:https://dev.to/taslangraham/node-js-event-emitter-fed