¿Node.js eventemitter.on se reciclará si no lo eliminas manualmente?
Node.js EventEmitter
Todas las operaciones de E/S asincrónicas en Node.js envían un evento a la cola de eventos cuando se completan.
Muchos objetos en Node.js emitirán eventos: un objeto net.Server emitirá un evento cada vez que haya una nueva conexión, y un objeto fs.readStream emitirá un evento cuando se abra el archivo. . Todos estos objetos generadores de eventos son instancias de events.EventEmitter.
Clase EventEmitter
El módulo de eventos proporciona solo un objeto: events.EventEmitter. El núcleo de EventEmitter es la encapsulación de las funciones de activación y escucha de eventos.
Puedes acceder a este módulo a través de require("events");.
//Introducir el módulo de eventos var events = require('events');//Crear el objeto eventEmitter var eventEmitter = new events.EventEmitter();
Si se crea una instancia del objeto EventEmitter Cuando ocurre un error, se activará el evento de error. El evento newListener se activa cuando se agrega un nuevo oyente y el evento removeListener se activa cuando se elimina un oyente.
Aquí usamos un ejemplo simple para ilustrar el uso de EventEmitter:
//event.js file var EventEmitter = require('events').EventEmitter var event = new EventEmitter; ( ); event.on('algún_evento', función() { console.log('algún_evento activado'); }); setTimeout(función() { evento.emit('algún_evento'); }, 1000); / p>
Los resultados de la ejecución son los siguientes:
Después de ejecutar este código, la consola genera ?'evento_algún_evento activado' después de 1 segundo. El principio es que el objeto de evento registra un oyente para el evento some_event, y luego usamos setTimeout para enviar el evento some_event al objeto de evento después de 1000 milisegundos. En este momento, se llamará al oyente de some_event.
$ node event.js
activador de evento some_event
Cada evento de EventEmitter consta de un nombre de evento y varios parámetros. El nombre del evento generalmente es una cadena. expresa cierta semántica. Para cada evento, EventEmitter admite varios detectores de eventos.
Cuando se activa un evento, los detectores de eventos registrados en este evento se llaman en secuencia y los parámetros del evento se pasan como parámetros de función de devolución de llamada.
Expliquemos este proceso con el siguiente ejemplo:
//event.js file var events = require('events'); var emitter = new events.EventEmitter(); emitter.on('algunEvento', function(arg1, arg2) { console.log('oyente1', arg1, arg2); }); emitter.on('algunEvento', function(arg1, arg2) { console.log( 'listener2', arg1, arg2); }); emitter.emit('someEvent', 'arg1 parametro', 'arg2 parametro');
Ejecute el código anterior y los resultados serán los siguientes:
$ node event.js
escucha1 parámetro arg1 parámetro arg2 escucha2 parámetro arg1 parámetro arg2
En el ejemplo anterior, el emisor registra dos detectores de eventos para el evento someEvent y luego se activó el evento someEvent.
Puedes ver en los resultados de ejecución que dos funciones de devolución de llamada del detector de eventos se llaman sucesivamente. Este es el uso más sencillo de EventEmitter.
EventEmitter proporciona múltiples propiedades, como ?on? y ?emit. La función on? se usa para vincular la función de evento y el atributo emit? A continuación, echemos un vistazo más de cerca a las propiedades de EventEmitter.
Método
Número de serie
Método y descripción
1 addListener(evento, oyente)
Especifica el evento Agrega un oyente al final de la matriz de oyentes.
2 on(event, listener)
Registra un oyente para el evento especificado, aceptando un evento de cadena y una función de devolución de llamada. server.on('conexión', función (transmisión) {
console.log('¡alguien conectado!');});
3 una vez (evento, oyente) p> p>
Registre un oyente único para el evento especificado, es decir, el oyente solo se activará una vez como máximo y se liberará inmediatamente después de la activación. server.once('conexión', función (transmisión) {
console.log('¡Ah, tenemos nuestro primer usuario!');});
4 removeListener(event , oyente)
Eliminar un oyente para el evento especificado. El oyente debe ser un oyente registrado para el evento.
Acepta dos parámetros, el primero es el nombre del evento y el segundo es el nombre de la función de devolución de llamada.
var callback = function(stream) {
console.log('¡alguien conectado!');};server.on('conexión', callback);// .. .server.removeListener('connection', callback);
5 removeAllListeners([event])
Eliminar todos los oyentes para todos los eventos Si se especifica el evento, elimine el evento especificado. Todos los oyentes del evento.
6 setMaxListeners(n)
De forma predeterminada, EventEmitters generará un mensaje de advertencia si agrega más de 10 oyentes. La función setMaxListeners se utiliza para aumentar el límite predeterminado del número de oyentes.
7 oyentes(evento)
Devuelve la matriz de oyentes para el evento especificado.
8 emit(event, [arg1], [arg2], [...])
Ejecuta cada oyente en el orden de los parámetros y devuelve verdadero si el evento tiene un oyente registrado; de lo contrario, devuelve falso.
Método de clase
Número de serie
Método y descripción
1 listenerCount(emisor, evento)
Retorno el especificado El número de oyentes para el evento.
Evento
Número de serie
Evento y descripción
1 newListener
¿evento?- cadena, nombre del evento
¿oyente?-Función de manejo de eventos
Este evento se activa cuando se agrega un nuevo oyente.
2 removeListener
evento? - cadena, nombre del evento
escucha? - función de procesamiento de eventos
De la matriz de escucha especificada Eliminar un oyente. Cabe señalar que esta operación cambiará el índice de esos oyentes después del oyente eliminado.
Ejemplo
El siguiente ejemplo demuestra la aplicación de la clase EventEmitter a través del evento de conexión.
Cree el archivo main.js con el siguiente código:
var events = require('events');var eventEmitter = new events.EventEmitter();//Listener #1var oyente1 = función oyente1() {
console.log('Se ejecuta el oyente oyente1.');}//Oyente #2var oyente2 = función oyente2() {
console.log ('Listener listener2 se ejecuta.');}// Vincula el evento de conexión, la función de procesamiento es listener1 eventEmitter.addListener('connection', listening1);// Vincula el evento de conexión, la función de procesamiento es listener2eventEmitter.on('connection ' , listener2);var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');console.log(eventListeners + "Los oyentes escuchan eventos de conexión.");//Manejar eventos de conexión eventEmitter.emit ('conexión');//Eliminar la función oyente1 eventEmitter.removeListener('conexión', oyente1);console.log("el oyente1 ya no está monitoreado.
");//Activar eventos de conexión eventEmitter.emit('connection');eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');console.log(eventListeners + " oyentes para escuchar eventos de conexión .");console.log("Ejecución del programa completada.");
Los resultados de la ejecución del código anterior son los siguientes:
$ node main.js2 oyentes monitorean eventos de conexión . El oyente1 ya no se escucha. 1 oyente escucha el evento de conexión.
EventEmitter define un error de evento especial, que contiene semántica de error.
Cuando se activa el error, EventEmitter especifica si no hay ningún oyente que responda, Node.js lo tratará como una excepción, saldrá del programa y generará un mensaje de error. generalmente es necesario configurar un detector para el objeto que desencadena el evento de error para evitar que todo el programa falle cuando ocurre un error. Por ejemplo:
var events = require('events var emitter = new events'); .EventEmitter(); emitter.emit('error');
Se mostrará el siguiente error al ejecutar:
node.js:201 throw e // Process.nextTick error o evento de 'error' en el primer tick ^ Error: evento de 'error' no detectado y no especificado en EventEmitter.emit (events.js: 50:15) en Object.
Heredar EventEmitter
La mayoría La mayoría de las veces no usaremos EventEmitter directamente, sino que lo heredaremos en el objeto. Incluyendo fs, net, http, siempre que los módulos principales que admiten la respuesta a eventos sean subclases de EventEmitter.
¿Por qué hacer esto? Hay dos razones:
Primero, la implementación del evento de un objeto con una determinada función de entidad se ajusta a la semántica, y el monitoreo y la ocurrencia de eventos deben ser métodos de un objeto.
En segundo lugar, el mecanismo de objetos de JavaScript se basa en prototipos y admite herencia múltiple parcial. Heredar EventEmitter no alterará la relación de herencia original del objeto.