Tengo este problema con la conexión socket.io. Necesito obtener el atributo socket.connected que está dentro de la instancia de socket.io. Si consuelo. registro el objeto, muestra el "conectado" como verdadero, pero cuando uso la variable, siempre devuelve falso. Aquí está el código:
Mi objeto socketConnection con patrón singleton
const socketConnection = { _instance: null, _isConnected: false, _interval: null, get getInstance() { if (!this._instance) { this._instance = io.connect(`/${sms.link}`, { reconnection: false }); this._instance.on("connect", () => { this._isConnected = true; }); this._instance.on("disconnect", () => { this._isConnected = false; this._interval = window.setInterval(() => { if (this._isConnected) { clearInterval(this._interval); this._interval = null; return; } socketConnection.getInstance; }, 5000); }); } return this._instance; } };La función a la que llamo el objeto socketConnection
function openSocketCommunication() { const socket = socketConnection.getInstance; if(socket && socket.connected) { notification.show("{% trans 'Chat connection established' %}", "success"); socket.on("incomingMessage", (message) => { createMessage(message); removeTypingEffect(); goToBottom(); }); socket.on("incomingTyping", () => { if (!typingDots) { createTypingDots(); } if (!typing) { typing = true; addTypingEffect(); } clearTimeout(typingTimeout); typingTimeout = setTimeout(clearTyping, 2000); }); } else { notification.show("{% trans 'Coudn\'t establish chat connection. Try to reload the page' %}", "error"); typingForm.style.display = 'none'; } }Lo extraño es que si configuro un tiempo de espera de 1 segundo, puedo ver el valor correcto
setTimeout(() => { console.log(socket.connected,socket.id) }, 1000);Traté de empaquetar dentro de una estrategia asíncrona/esperar y prometer/resolver pero aún así no funcionó. ¿Alguna idea?
El problema es que socket.io no se ha conectado al servidor la primera vez que ejecuta if(socket && socket.connected) . Por lo tanto, debe agregar un oyente en 'conectar' dentro de openSocketCommunication , que reaccionará cuando realmente tenga la conexión en funcionamiento.
Algo como esto:
function openSocketCommunication() { const socket = socketConnection.getInstance; if(socket) { socket.on("connect", () => { // Run all code that should run each time you get a reconnect notification.show("{% trans 'Chat connection established' %}", "success"); // You might need a flag to avoid adding multiple listeners for incomingMessage socket.on("incomingMessage", (message) => { createMessage(message); removeTypingEffect(); goToBottom(); }); // You might need a flag to avoid adding multiple listeners for incomingTyping socket.on("incomingTyping", () => { if (!typingDots) { createTypingDots(); } if (!typing) { typing = true; addTypingEffect(); } clearTimeout(typingTimeout); typingTimeout = setTimeout(clearTyping, 2000); }); }); } else { notification.show("{% trans 'Coudn\'t establish chat connection. Try to reload the page' %}", "error"); typingForm.style.display = 'none'; } }