Tengo un objeto literal para crear una conexión websocket
let websocket; const websocketConnect = { conn: null, start: function () { this.conn = new WebSocket('wss://.....'); websocket = this.conn; this.conn.onopen = (e) => {}; this.conn.onmessage = (e) => {}; this.conn.onclose = (e) => { this.reconnect(); }; }, reconnect: function () { this.start(); }, }; websocketConnect.start(); websocket.addEventListener('message', function (e) { /***/ });la variable websocket es global y se le asigna la conexión websocket, de modo que puedo adjuntar un eventListener fuera de websocketConnect . si se pierde la conexión, intento establecer una nueva conexión a través de reconnect().
el problema ahora es que websocket se reasigna en start() y eventListener se bloquea en el antiguo websocket y no en el nuevo. ¿Puedo copiar eventListener y asignarlo a la nueva variable websocket ?
Puede crear una serie de funciones que desee utilizar para procesar los mensajes entrantes:
let websocket const websocketConnect = { conn: null, messageFunctions: [], start: function () { this.conn = new WebSocket('wss://.....') this.conn.onmessage = (e) => { for (const func of messageFunctions) func(e) } websocket = this.conn }, reconnect: function () { websocket = null this.start() } } websocketConnect.messageFunctions.push((event) => { console.log('handler1', event) }) websocketConnect.messageFunctions.push((event) => { console.log('handler2', event) }) websocketConnect.start()De esta manera, sus funciones no se adjuntan directamente al WebSocket y se pueden llamar para cualquier conexión WebSocket nueva sin duplicar las funciones anónimas.
Puede definir su propio método addEventListener y reenviar las llamadas al método real, pero también hacer un seguimiento de ellas. De esa manera, puede volver a aplicarlos cuando se realice una nueva conexión.
const websocket = { conn: null, listeners: [], start() { this.conn = new WebSocket('wss://.....'); // Restore event listeners for (let {event, callback} of this.listeners) { this.conn.addEventListener(event, callback); } this.conn.onclose = (e) => { this.reconnect(); }; }, reconnect() { this.start(); }, addEventListener(event, callback) { // Save event listener this.listeners.push({event, callback}); if (this.conn) this.conn.addEventListener(event, callback); } } websocket.start(); websocket.addEventListener('message', function (e) { /***/ });