You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何销毁/释放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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:20:57