Latest web development tutorials

Node.js EventEmitter

Node.js toda operación de E / S asíncrona al finalizar enviará un evento a la cola de eventos.

Node.js la que muchos objetos se distribuyen evento: un objeto distribuido net.Server un evento cada vez que una nueva conexión, unos objetos fs.readStream se emitirán en el caso de que un archivo se abre cuando. Todos estos objetos se generan eventos events.EventEmitter ejemplo.


clase EventEmitter

módulo de eventos proporciona un único objeto: events.EventEmitter. Core EventEmitter es activado por eventos y detector de eventos paquete de funciones.

Puede ( "eventos") por necesitar; para acceder al módulo.

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

EventEmitter Si se produce un error cuando se crea una instancia de un objeto, se disparará el evento "error". Al agregar un nuevo oyente, evento 'newListener' se activa cuando se retira el oyente, el evento 'removeListener' se dispara.

Aquí se utiliza un simple ejemplo muestra el uso EventEmitter:

//event.js 文件
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
event.on('some_event', function() { 
	console.log('some_event 事件触发'); 
}); 
setTimeout(function() { 
	event.emit('some_event'); 
}, 1000); 

resultados de la ejecución son las siguientes:

Ejecutar este código, un segundo después de la salida de la consola'caso some_event disparador ".El principio es que el objeto se ha registrado en caso de eventos some_event de un oyente, y luego enviar eventos some_event por setTimeout 1000 milisegundos después del evento en el objeto, a continuación, llama oyente some_event.

$ node event.js 
some_event 事件触发

Cada EventEmitter evento mediante un nombre de evento y una serie de parámetros, el nombre del evento es una cadena, expresada generalmente cierta semántica. Para cada evento, EventEmitter soporta varios detector de eventos.

Cuando se produce el evento, el evento para registrar detectores de eventos se denominan secuencialmente como argumento parámetro de evento de devolución de llamada.

Tomemos el siguiente ejemplo ilustra este proceso:

//event.js 文件
var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
	console.log('listener1', arg1, arg2); 
}); 
emitter.on('someEvent', function(arg1, arg2) { 
	console.log('listener2', arg1, arg2); 
}); 
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数'); 

Ejecutar el código anterior, ejecute la siguiente manera:

$ node event.js 
listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数

El ejemplo anterior, algunEvento emisor registrado para el evento, dos detectores de eventos, y entonces se desencadena evento algunEvento.

Los resultados operativos se pueden ver en función de detector de devolución de llamada de dos eventos que se ha llamado. Esto es EventEmitter uso más fácil.

EventEmitter ofrece una serie de atributos, tales comoel y emitir.en función se utiliza para vincularla función de eventos,emiten atributo se utiliza para activar un evento. A continuación nos fijamos propiedades EventEmitter específicos descritos.

camino

No. Método y Descripción
1 addListener (evento, escucha)
Añadir un detector para el detector de eventos especificado al final de la matriz.
2 en (evento, escucha)
Para el evento especificado para registrar un oyente acepta un evento de cuerda y una función de devolución de llamada.
server.on('connection', function (stream) {
  console.log('someone connected!');
});
3 una vez (evento, escucha)
El registro de un solo detector para el evento especificado, que la mayoría de los oyentes se disparará una vez, despues de soltar el gatillo oyente.
server.once('connection', function (stream) {
  console.log('Ah, we have our first user!');
});
4 removeListener (evento, escucha)
Elimina el evento especificado a un oyente, el oyente debe ser el evento tiene detectores registrados.
var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
5 removeAllListeners ([evento])
Elimina todos los oyentes de todos los eventos, si un evento especificado, eliminar el evento especificado para todos los oyentes.
6 setMaxListeners (n)
Por defecto, si EventEmitters añadir detectores de más de 10 es la salida un mensaje de advertencia. función setMaxListeners se utiliza para aumentar el número de oyentes de los límites predeterminados.
7 oyentes (evento)
Devuelve una matriz de detectores para el evento especificado.
8 emitir (evento, [arg1], [arg2], [...])
Cada parámetros de orden de ejecución oyente, si hay detector de eventos registrada devuelve verdadero, de lo contrario devuelve false.

Los métodos de clase

No. Método y Descripción
1 listenerCount (emisor, evento)
Devuelve el número de agentes de escucha para el evento especificado.

evento

No. Eventos y descripción
1 newListener
  • nombre de la cadena del evento- evento

  • escucha - la función de control de eventos

El evento se activa cuando se agrega un nuevo oyente.

2 removeListener
  • nombre de la cadena del evento- evento

  • escucha - la función de control de eventos

Retirar un oyente a partir de la matriz receptor especificado. Tenga en cuenta que esto va a cambiar en el índice es que el oyente escucha después de eliminar.

Ejemplos

Los siguientes ejemplos a través de la conexión (conexión) evento demuestra aplicaciones de clase EventEmitter.

Crear archivo main.js, de la siguiente manera:

var events = require('events');
var eventEmitter = new events.EventEmitter();

// 监听器 #1
var listener1 = function listener1() {
   console.log('监听器 listener1 执行。');
}

// 监听器 #2
var listener2 = function listener2() {
  console.log('监听器 listener2 执行。');
}

// 绑定 connection 事件,处理函数为 listener1 
eventEmitter.addListener('connection', listener1);

// 绑定 connection 事件,处理函数为 listener2
eventEmitter.on('connection', listener2);

var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

// 处理 connection 事件 
eventEmitter.emit('connection');

// 移除监绑定的 listener1 函数
eventEmitter.removeListener('connection', listener1);
console.log("listener1 不再受监听。");

// 触发连接事件
eventEmitter.emit('connection');

eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

console.log("程序执行完毕。");

Código anterior, los resultados de ejecución son las siguientes:

$ node main.js
2 个监听器监听连接事件。
监听器 listener1 执行。
监听器 listener2 执行。
listener1 不再受监听。
监听器 listener2 执行。
1 个监听器监听连接事件。
程序执行完毕。

evento de error

EventEmitter define un error de evento especial, que contiene un error de semántica, lo que normalmente desencadenar un evento de error en la cara de excepciones.

Cuando se activa el error, EventEmitter estipulan que si no hay respuesta a un oyente, Node.js lo utilizará como una excepción, salir del programa con un mensaje de error.

Para hacer referencia a que por lo general se disparará la configuración de detector de eventos de error, evitar el error se encuentra durante todo el programa se bloquea. Por ejemplo:

var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.emit('error'); 

De marcha se muestra el siguiente error:

node.js:201 
throw e; // process.nextTick error, or 'error' event on first tick 
^ 
Error: Uncaught, unspecified 'error' event. 
at EventEmitter.emit (events.js:50:15) 
at Object.<anonymous> (/home/byvoid/error.js:5:9) 
at Module._compile (module.js:441:26) 
at Object..js (module.js:459:10) 
at Module.load (module.js:348:31) 
at Function._load (module.js:308:12) 
at Array.0 (module.js:479:10) 
at EventEmitter._tickCallback (node.js:192:40) 

EventEmitter herencia

La mayor parte del tiempo que no utilizan directamente EventEmitter, pero heredaron en el objeto. Incluyendo fs, neto, http, entre ellos, siempre y cuando los módulos básicos de apoyo de respuesta a incidentes son subclases de EventEmitter.

¿Por qué? Hay dos razones:

En primer lugar, el objeto tiene la funcionalidad de una realización física de eventos que cumplen el monitor de emisión y la semántica, el evento debe ser un objeto.

En segundo lugar, el mecanismo objeto de JavaScript es una herencia soporte multi-parte basado en prototipos, objetos EventEmitter no interrumpe la herencia originales.