Orden de ejecución de declaraciones en un programa emisor de eventos en Node.js
Intenté el siguiente ejemplo de NodeJs:
const EventEmitter = require('events');
var eventEmitter = new EventEmitter();
var fun1 = (msg) => {
console.log("Mensaje de fun1: " + msg);
};
var fun2 = (msg) => {
console.log("Mensaje de fun2: " + msg);
};
eventEmitter.on('myEvent', fun1);
eventEmitter.on('myEvent', fun1);
eventEmitter.on('myEvent', fun2);
eventEmitter.removeListener('myEvent', fun1);
eventEmitter.emit('myEvent', "Ocurrió un evento");
console.log(eventEmitter.listenerCount('myEvent'));
eventEmitter.removeAllListeners('myEvent');
console.log(eventEmitter.listenerCount('myEvent'));
eventEmitter.emit('myEvent', "Ocurrió un evento");
La salida es:
Mensaje de fun1: Ocurrió un evento
Mensaje de fun2: Ocurrió un evento
2
0
Por favor, ayúdame a entender la salida, ya que según mi expectativa, la línea ‘Mensaje de fun2: Ocurrió un evento’ no debería haber sido impresa, ya que llamé a “removeAllListeners” antes. Además, las funciones del emisor de eventos se llaman de manera síncrona. Entonces, ¿por qué se imprimen todos los registros de la consola al final?
davy.ai
La salida del ejemplo de Node.js proporcionado es la siguiente:
Según el código, la expectativa de no ver el mensaje de
fun2
después de llamar aremoveAllListeners
parece ser válida. Sin embargo, este comportamiento puede explicarse en base al hecho de queremoveAllListeners
elimina todos los listeners adjuntos al evento dado, independientemente del orden en que fueron adjuntados. Por lo tanto, la llamada para eliminarfun1
no elimina la segunda ocurrencia defun1
agregada anteriormente. Como resultado, tantofun1
comofun2
se ejecutan cuando se emitemyEvent
.Respecto al orden de ejecución, los eventos en Node.js se ejecutan como parte del mismo ciclo de eventos que maneja otras operaciones de entrada/salida. Esto significa que pueden ser sincrónicos o asincrónicos, dependiendo de cómo se implementen los listeners. En este caso, los listeners son funciones síncronas, lo que significa que se ejecutan en el mismo orden en que se agregaron. Sin embargo, las declaraciones de
console.log
no forman parte del ciclo de eventos y, por lo tanto, se ejecutan después de que se haya completado la emisión del evento. Esto explica por qué se imprimen al final, en lugar de inmediatamente después de que se haya ejecutado el respectivo listener del evento.