如何销毁/释放JavaScript WebSocket实例?Angular场景技术求助
如何彻底销毁/释放WebSocket实例?
我尝试了各类网上能找到的解决方案,都无法彻底销毁WebSocket实例,相关代码如下:
export class MyWebsocketService { public url; private ws: WebSocket; constructor(URL: string) { this.url = URL; this.connect(); } connect() { this.ws = new WebSocket(this.url); this.ws.onopen = () => { /* 业务逻辑 */ }; this.ws.onmessage = () => { /* 业务逻辑 */ }; this.ws.onclose = () => { // 尝试过的销毁操作均无效 this.ws.onopen = null; this.ws.onmessage = null; this.ws.onclose = null; this.ws.onerror = null; this.ws.close(); this.ws = null; delete this.ws; setTimeout(() => { console.log('Reconnecting...'); this.connect(); }, 3000); }; } } // 组件中的调用代码 ... public websocket: MyWebsocketService; createWebsocketsServices() { this.websocket = new MyWebsocketService('wss://whatever'); // 切换URL时重新创建实例 this.websocket = new MyWebsocketService('wss://my-new-url'); // **第一个WebSocket实例依然留在内存中,处于活跃状态!!!** } ngOnInit(): void { this.createWebsocketsServices(); }
补充说明
实际业务场景中发现:如果先后尝试连接4个无效URL,再切换到有效URL,WebSocket服务器会记录4个活跃连接,而非预期的1个,这说明旧的WebSocket实例并未被销毁,仍在后台保持连接。
核心需求
- 实现WebSocket基础连接功能
- 连接失败时,每3秒自动尝试重连
- 运行时切换URL:必须完全销毁当前WebSocket实例,再创建新URL对应的实例
临时方案
目前有一个临时方法可以实现URL切换,但并未从根本上解决内存释放和旧实例销毁的问题。
内容的提问来源于stack exchange,提问作者Fractal Mind
相关产品推荐
相关产品推荐

