From 5f719d5e5ab976a42a8da5dfb9b1244227b9c081 Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Fri, 6 Dec 2024 17:12:30 +0800 Subject: [PATCH] fix: duplicate websocket connection --- src/ws/service.js | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/ws/service.js b/src/ws/service.js index 57fe95b..113e6af 100644 --- a/src/ws/service.js +++ b/src/ws/service.js @@ -1,5 +1,11 @@ class WSService { constructor(options) { + // 确保单例模式 + if (WSService.instance) { + return WSService.instance; + } + WSService.instance = this; + const { wsUrl, onConnect, @@ -19,7 +25,7 @@ class WSService { message: onMessage || (() => {}), messageError: onMessageError || (() => {}), }; - // 0: 未连接,1: 已连接,-1: 已关闭 + // 0: 未连接,1: 连接中,2: 已连接,-1: 已关闭 this.connected = 0; this.ws = undefined; this.evt = (event) => { @@ -40,20 +46,25 @@ class WSService { } get isConnected() { - return this.connected === 1; + return this.connected === 2; } active() { - if (this.connected === 1) { - throw new Error('已创建连接,请勿重复创建'); + if (this.connected !== 0) { + console.warn('WebSocket connection already exists or is connecting'); + return; } + + // 标记为正在连接中 + this.connected = 1; + // 创建 WebSocket 连接 this.ws = new WebSocket(this.$wsUrl); this.ws.addEventListener('open', (event) => { if (this.debug) { console.log('socket connected', event); } - this.connected = 1; + this.connected = 2; this.$on.connect(event); }); this.ws.addEventListener('close', (event) => { @@ -61,6 +72,7 @@ class WSService { console.log('socket closed', event); } this.connected = -1; + WSService.instance = null; // 清除实例引用 this.$on.close(event); }); this.ws.addEventListener('message', this.evt);