2012-09-23 10 views
8

Digamos que estoy creando mi propio módulo, que se encuentra en la parte superior del módulo 'net'. Mi módulo tiene sus propios eventos, sino que también permite a los clientes para escuchar en eventos de red emitidos por la conexión TCP:en node.js, cómo reenviar todos los eventos del módulo a otro

mymod.on('myevent',...); // my event 
mymod.on('connect',...); // net event 
mymod.on('end',...);  // net event 

En este momento estoy haciendo lo siguiente

... 
tcp.on('connect',function(){ self.emit('connect');}); 
tcp.on('end',function(){ self.emit('end');}); 
... 

¿Hay una manera más idiomática de mí para simplemente reenviar todos los eventos (o un subconjunto de eventos) de un módulo a los clientes de otro módulo?

Espero que ese escenario surja todo el tiempo, así que me gustaría hacerlo de la manera más limpia que pueda.

Respuesta

2

Lo que he hecho en el pasado es handle the newListener event. No me molesto en adjuntar controladores hasta que uno se una a mi clase. Luego, cuando lo es, lo adjunto a la clase base.

this.on('newListener', function (event, listener) { 
    baseClassInstance.on(event, listener); 
}) 

Puede filtrar los eventos que se transmiten a través marcando el parámetro event primero.

Tenga cuidado si tiene que eliminar oyentes. Esta puede no ser la mejor solución en esos casos.

+0

Parece que será un evento 'removeListener' en v0.10 (https://github.com/joyent/node/pull/3806) –

0

Nunca lo he probado y no puedo probar esto en este momento, pero podría intentar lo siguiente;

Proxy todos los eventos a otro objeto

tcp.emit = mymod.emit.bind(mymod); 

eventos proxy y llamar a su propia;

var oldEmit = tcp.emit; 

tcp.emit = function() { 
    mymod.emit.apply(mymod, arguments); 
    return oldEmit.apply(this, arguments); 
} 

¡Avísame si funciona! Lo anterior es solo una prueba de concepto y no he pensado en los efectos secundarios de hacer esto.

+0

Esto significaría que otros módulos que escuchan los eventos 'tcp' normalmente emitirían no llamarían a sus controladores. –

+0

correcto si también necesita estar disponible para otros controladores, he actualizado el código. De cualquier forma, esto no es de ninguna manera un uso sugerido simplemente como una prueba de concepto –

Cuestiones relacionadas