Cuando se usa SocketIO, la recepción de cualquier mensaje se realiza de la siguiente manera:
socket.on("eventname", function() { // Whatever }Pero "eventname" puede ser literalmente cualquier cadena de texto.
¿Cómo lograron eso? ¿Cómo tienen un detector de eventos para todas y cada una de las cadenas posibles? ¿Agregan detectores de eventos A medida que llegan los mensajes?
Intenté leer el código fuente de SocketIO, pero se me pasó por alto.
La respuesta se puede encontrar mirando la documentación:
Del código fuente de Socket.IO :
socket.on(eventName, callback) (inherited from EventEmitter)Desde aquí :
Internamente, EventEmitter realiza un seguimiento de un objeto llamado this.events que asigna nombres de eventos a matrices de controladores de eventos. Cuando un programa llama al método on con un nombre de evento y un controlador de eventos, EventEmitter agrega el controlador a la matriz para ese nombre de evento.
Básicamente, el socket mantiene un mapa de eventos, codificado por nombre, en una serie de funciones que se llaman cuando se recibe ese evento.
Y si observa la documentación de EventEmitter.on , verá que es bastante tonto: no verifica que no esté agregando la misma función dos veces:
.on() -> Agrega la función de escucha al final de la matriz de escuchas para el evento llamado eventName . No se realizan comprobaciones para ver si el oyente ya se ha agregado. Varias llamadas que pasan la misma combinación de eventName y listener darán como resultado que el listener se agregue y se llame varias veces.