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:
@@ -16,6 +16,7 @@ class SocketService {
|
|||||||
this.reconnectAttempts = 0;
|
this.reconnectAttempts = 0;
|
||||||
this.maxReconnectAttempts = Infinity; // 无限重试
|
this.maxReconnectAttempts = Infinity; // 无限重试
|
||||||
this.customReconnectTimer = null; // 自定义重连定时器
|
this.customReconnectTimer = null; // 自定义重连定时器
|
||||||
|
this.pendingListeners = []; // 暂存等待注册的事件监听器
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -50,6 +51,15 @@ class SocketService {
|
|||||||
...options,
|
...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.socket.on('connect', () => {
|
||||||
this.connected = true;
|
this.connected = true;
|
||||||
@@ -147,8 +157,10 @@ class SocketService {
|
|||||||
*/
|
*/
|
||||||
on(event, callback) {
|
on(event, callback) {
|
||||||
if (!this.socket) {
|
if (!this.socket) {
|
||||||
logger.warn('socketService', 'Cannot listen to event: socket not initialized', { event });
|
// Socket 未初始化,暂存监听器
|
||||||
console.warn(`[socketService] ❌ 无法监听事件 ${event}: Socket 未初始化`);
|
logger.info('socketService', 'Socket not ready, queuing listener', { event });
|
||||||
|
console.log(`[socketService] 📦 Socket 未初始化,暂存事件监听器: ${event}`);
|
||||||
|
this.pendingListeners.push({ event, callback });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user