¿Qué es un "emisor de eventos"?


76

Navegando por http://microjs.com , veo muchas bibliotecas etiquetadas como "emisores de eventos". Me gusta pensar que conozco bastante bien los conceptos básicos del lenguaje Javascript, pero realmente no tengo idea de lo que es o hace un "emisor de eventos".

¿Alguien me puede explicar? Suena interesante...

Respuestas:


60

Desencadena un evento que cualquiera puede escuchar. Diferentes bibliotecas ofrecen diferentes implementaciones y para diferentes propósitos, pero la idea básica es proporcionar un marco para emitir eventos y suscribirse a ellos.

Ejemplo de jQuery:

// Subscribe to event.
$('#foo').bind('click', function() {
    alert("Click!");
});

// Emit event.
$('#foo').trigger('click');

Sin embargo, con jQuery para emitir un evento, debe tener un objeto DOM y no puede emitir eventos desde un objeto arbitrario. Aquí es donde el emisor de eventos se vuelve útil. Aquí hay un pseudocódigo para demostrar eventos personalizados (exactamente el mismo patrón que el anterior):

// Create custom object which "inherits" from emitter. Keyword "extend" is just a pseudo-code.
var myCustomObject = {};
extend(myCustomObject , EventEmitter);

// Subscribe to event.
myCustomObject.on("somethingHappened", function() { 
    alert("something happened!");
});

// Emit event.
myCustomObject.emit("somethingHappened");

12
Su último párrafo es incorrecta, jQuery hace de soporte eventos y declaraciones personalizados. Ejemplo: jsfiddle.net/PzRtn
Rob W

@RobW Gracias por la corrección. Sin embargo, la limitación de jQuery es que requiere un objeto jQuery / DOM para emitir eventos. ¿Es eso correcto?
niaher

He arreglado la respuesta. Por favor, avíseme si aún observa algún problema. Gracias.
niaher

4
jQuery puede hacer eventos sin un elemento DOM, usando $ ({})
Ja͢ck


21

En node.js, un evento se puede describir simplemente como una cadena con una devolución de llamada correspondiente. Un evento se puede "emitir" (o en otras palabras, se puede llamar a la devolución de llamada correspondiente) varias veces o puede elegir escuchar solo la primera vez que se emite.

Ejemplo:-

var example_emitter = new (require('events').EventEmitter);
example_emitter.on("test", function () { console.log("test"); });
example_emitter.on("print", function (message) { console.log(message); });
example_emitter.emit("test");
example_emitter.emit("print", "message");
example_emitter.emit("unhandled");

> var example_emitter = new (require('events').EventEmitter);
{}
> example_emitter.on("test", function () { console.log("test"); });
{ _events: { test: [Function] } }
> example_emitter.on("print", function (message) { console.log(message); });
{ _events: { test: [Function], print: [Function] } }
> example_emitter.emit("test");
test //console.log'd
true //return value
> example_emitter.emit("print", "message");
message //console.log'd
true    //return value
> example_emitter.emit("unhandled");
false   //return value

Esto demuestra toda la funcionalidad básica de un EventEmitter. El on or addListenermétodo (básicamente el método de suscripción) le permite elegir el evento a vigilar y la devolución de llamada a llamar. losemit método (el método de publicación), por otro lado, le permite "emitir" un evento, lo que hace que todas las devoluciones de llamada registradas en el evento se 'activen' (sean llamadas).

De la fuente ¿Qué son los emisores de eventos?


buena explicación del artículo que originalmente no tenía mucho sentido para mí
Vass

4

Ejemplo simple en Node.js:

var EventEmitter = require('events').EventEmitter;
var concert = new EventEmitter;
var singer = 'Coldplay';

concert.on('start', function (singer) {
  console.log(`OMG ${singer}!`);
});

concert.on('finish', function () {
  console.log(`It was the best concert in my life...`);
});

concert.emit('start', singer);
concert.emit('finish');

1

Considere una función de devolución de llamada

function test(int a, function(){
     console.log("I am call-back function");
   }){
    console.log("I am a parent function");
 }

Ahora, siempre que se llama a la función principal en un evento (un clic en un botón o cualquier conexión, etc.), primero ejecuta su código y luego el control se pasa a la función de devolución de llamada. Ahora, un emisor de eventos es un objeto / método que desencadena un evento tan pronto como se lleva a cabo alguna acción para pasar el control a la función principal. Por ejemplo, el servidor es un emisor de eventos en la programación de Node.Js. Emite un evento de error tan pronto como el servidor encuentra un error que pasa el control a la función principal del error. El servidor emite un evento de conexión tan pronto como un conector se conecta al servidor, este evento activa la función principal de getConnections, que de hecho también toma una función de devolución de llamada como argumento. Entonces, de hecho, es una cadena, que se activa cuando algo sucede mediante el emisor de eventos que emite un evento para iniciar la ejecución de una función.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.