¿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...

wwaawaw
fuente

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");
niaher
fuente
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
2
@Jack stackoverflow.com/questions/1553342/…
jonathancardoso
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?

Rahul Tripathi
fuente
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');
Eldiyar Talantbek
fuente
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.

Vinayak Trivedi
fuente