From 8ced77c60480b16fb665824c8762837354172d42 Mon Sep 17 00:00:00 2001 From: zdl <3489966805@qq.com> Date: Mon, 10 Nov 2025 17:25:08 +0800 Subject: [PATCH] =?UTF-8?q?fix(socket):=20=E4=BF=AE=E5=A4=8D=20Socket=20?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=BA=E5=BA=8F=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E4=BA=8B=E4=BB=B6=E7=9B=91=E5=90=AC=E4=B8=A2=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 pendingListeners 队列暂存早期注册的事件监听器 - on() 方法在 socket 未初始化时将监听器加入队列 - connect() 方法初始化后自动注册所有暂存的监听器 解决 NotificationContext 在 socket.connect() 之前调用 socket.on() 导致的监听器丢失问题。 🔧 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/services/socketService.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/services/socketService.js b/src/services/socketService.js index e1cdbd07..3203f923 100644 --- a/src/services/socketService.js +++ b/src/services/socketService.js @@ -16,6 +16,7 @@ class SocketService { this.reconnectAttempts = 0; this.maxReconnectAttempts = Infinity; // 无限重试 this.customReconnectTimer = null; // 自定义重连定时器 + this.pendingListeners = []; // 暂存等待注册的事件监听器 } /** @@ -50,6 +51,15 @@ class SocketService { ...options, }); + // 注册所有暂存的事件监听器 + if (this.pendingListeners.length > 0) { + console.log(`[socketService] 📦 注册 ${this.pendingListeners.length} 个暂存的事件监听器`); + this.pendingListeners.forEach(({ event, callback }) => { + this.on(event, callback); + }); + this.pendingListeners = []; // 清空暂存队列 + } + // 监听连接成功 this.socket.on('connect', () => { this.connected = true; @@ -147,8 +157,10 @@ class SocketService { */ on(event, callback) { if (!this.socket) { - logger.warn('socketService', 'Cannot listen to event: socket not initialized', { event }); - console.warn(`[socketService] ❌ 无法监听事件 ${event}: Socket 未初始化`); + // Socket 未初始化,暂存监听器 + logger.info('socketService', 'Socket not ready, queuing listener', { event }); + console.log(`[socketService] 📦 Socket 未初始化,暂存事件监听器: ${event}`); + this.pendingListeners.push({ event, callback }); return; }