es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La salida del ejemplo de Node.js proporcionado es la siguiente:

    Mensaje de fun1: Evento ocurrido
    Mensaje de fun2: Evento ocurrido
    2
    0
    

    Según el código, la expectativa de no ver el mensaje de fun2 después de llamar a removeAllListeners parece ser válida. Sin embargo, este comportamiento puede explicarse en base al hecho de que removeAllListeners elimina todos los listeners adjuntos al evento dado, independientemente del orden en que fueron adjuntados. Por lo tanto, la llamada para eliminar fun1 no elimina la segunda ocurrencia de fun1 agregada anteriormente. Como resultado, tanto fun1 como fun2 se ejecutan cuando se emite myEvent.

    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.

Comments are closed.