estoy desconcertado Me imagino que he pisado algo de JavaScript esotérico, pero no sé qué es.
el codigo es
processMessage(ws, json){ let msg = JSON.parse(json); console.log(`Message(${msg.type}): ${msg.data}`); console.log("Available games: " + msg.data); // Normally isn't here, put it in to make sure I wasn't going crazy switch (msg.type){ case "welcome": console.log("Welcome received. Requesting available games."); let msg = { "type":"game list", "data":null }; ws.send(JSON.stringify(msg)); break; case "restore": break; case "game list": console.log("Available games: " + msg.data); break; case "create console": break; } }
Genera esta salida.
Message(welcome): undefined MainUI.js:94:21 Available games: undefined MainUI.js:95:21 Welcome received. Requesting available games. MainUI.js:98:29 Message(game list): The Office MainUI.js:94:21 Available games: The Office MainUI.js:95:21 Uncaught ReferenceError: can't access lexical declaration 'msg' before initialization MainUI.js:109:21 processMessage http://localhost:8000/MainUI.js:109 onmessage http://localhost:8000/MainUI.js:44 loaded http://localhost:8000/MainUI.js:42 onload http://localhost:8000/:1
Estoy bastante seguro de que la salida tiene msg
, o sus propiedades, a las que se accede 1,2,3...4 veces antes de que se produzca el error.
Aaaaaand, acabo de encontrar la causa. Sabía que era mi culpa pero ahí está lo esotérico.
Dentro del propio interruptor, puse
case "welcome": console.log("Welcome received. Requesting available games."); let msg = { "type":"game list", "data":null }; ws.send(JSON.stringify(msg)); break;
Ese segundo let msg
, en lugar de proporcionar un error como 'msg' has already been declared
, de alguna manera confunde al intérprete al pensar que msg
aún no se ha declarado. Eliminar let
y solo tener msg =
hace que el error desaparezca.
Si alguien lee esto y tiene una referencia para explicar la razón por la que esto sucede, realmente agradecería que agregara un comentario con un enlace.