fix(socket): 修复 Socket 初始化顺序导致的事件监听丢失

- 添加 pendingListeners 队列暂存早期注册的事件监听器
- on() 方法在 socket 未初始化时将监听器加入队列
- connect() 方法初始化后自动注册所有暂存的监听器

解决 NotificationContext 在 socket.connect() 之前调用 socket.on()
导致的监听器丢失问题。

🔧 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
zdl
2025-11-10 17:25:08 +08:00
parent 880c91e3de
commit 8ced77c604

View File

@@ -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;
}