闭包实现websocket“自修复”本质是封存状态与可控重连:封装实例、计数、定时器、队列,隔离模块;按断开原因响应,指数退避重试;消息带id可续传、有优先级;各实例独立,仅暴露安全接口。

闭包本身不“自修复”,但它能封存连接状态、重试上下文和任务队列,让重连逻辑真正可控、可追溯、不丢数据——这才是所谓“自修复”的实质。
封住关键状态,杜绝外部干扰
把 WebSocket 实例、重连计数、心跳定时器、待发消息队列这些变量全定义在外层函数作用域里,不暴露给全局或其它模块。
- ws 实例只在内部调用 send / close,外部无法误改 readyState
- reconnectCount 每次断开自动累加,达到上限就停,不靠全局变量判断
- heartTimer 和 reconnectTimer 都用 clearTimeout 精确清理,闭包确保指向最新一轮
- messageQueue 是数组 + 游标索引,避免 shift/pop 导致的频繁内存复制
按网络实际表现设计恢复节奏
真正的自修复不是盲目重试,而是对不同断开原因做出区分响应。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
- onclose 中检查 event.code:1006(异常关闭)才触发重连;1000(正常关闭)直接退出
- 用指数退避控制间隔:delay = Math.min(1000 * 1.5 ** count, 30000),避免雪崩式请求
- DNS 失败或连接超时,先延迟 2 秒再换备用地址重试,而不是立刻原地重连
- 连续两次 ping 无 pong 响应,就主动 close 并进入重连流程,不等 onclose 被动触发
任务不丢、可续传、有优先级
send 调用时若连接未就绪,不是报错或静默忽略,而是进队列,等恢复后自动续发。
- 每条消息带唯一 id 和 timestamp,便于去重与超时清理(比如 60 秒未发出则丢弃)
- resumePending 发送前检查 ws.readyState === WebSocket.OPEN,并用 try-catch 包裹 send
- 失败的消息重新 push 到队列尾部;成功则移动游标,不破坏原有顺序
- 高优消息可设 { immediate: true },连接一恢复就插队发送
多业务共用连接时互不污染
聊天、通知、行情等模块如果都走同一个 WebSocket,必须隔离各自的状态和错误处理路径。
- 每个 createResumableWS 实例是完全独立的闭包,变量不共享
- 对外只暴露 connect / send / close / on / off 接口,不暴露底层 timer 或 queue
- on('error') 回调由各业务自行注册,错误不会跨模块传播
- 重连失败时触发 onMaxRetry,由业务决定是告警、降级还是切换通道










