用闭包封装 WebSocket 心跳重连逻辑,核心是隔离状态、控制副作用、避免全局污染;通过私有作用域封闭 ws 实例、定时器、重连计数、消息队列等变量,仅暴露 connect/send/close 等最小接口,实现安全复用与自动状态管理。

用闭包封装 WebSocket 的心跳重连逻辑,核心在于**隔离状态、控制副作用、避免全局污染**。闭包天然提供私有作用域,能把连接实例、定时器 ID、重连计数、心跳开关等敏感状态封在函数内部,外部仅暴露 clean 接口(如 connect、send、close),既安全又利于复用。
状态变量全封闭在闭包内
所有与连接生命周期强相关的变量都不暴露给外部:WebSocket 实例、是否已连接、当前重连次数、心跳定时器、重连定时器、待发送消息队列等,全部定义在工厂函数作用域中。这样能防止外部误操作(比如手动修改 ws.readyState 或 clearTimeout 错的 timer),也避免多个实例互相干扰。
- ws:只读引用,不导出,仅内部调用 send / close
- reconnectCount:每次断开后自增,达到上限则停止重连
- heartTimer / reconnectTimer:严格配对使用 clearTimeout + setTimeout,闭包确保 timer 变量始终指向最新一轮
- messageQueue:连接未就绪时缓存 send 调用,open 后批量 flush
心跳逻辑由闭包自主调度
心跳不是“发完就不管”,而是闭环管理:发送 ping → 等待 pong → 超时则判定异常 → 触发重连。这个流程必须由闭包内部完全掌控。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
- onopen 时启动 heartTimer = setInterval(() => ws.send('ping'), 30000)
- onmessage 中识别 if (data === 'pong') { resetHeartTimeout() },重置超时计时器
- 单独起一个 timeoutTimer(比如 10s 无 pong 就 clear heartTimer 并 close)
- 整个心跳链路(ping → wait → timeout → close → reconnect)不依赖外部状态,纯靠闭包内变量流转
重连策略在闭包中可配置可收敛
重连不能无限循环。闭包允许你在初始化时传入策略参数,并在内部实现退避逻辑:
- 支持传入 maxReconnect: 5、baseDelay: 1000、backoff: 1.5
- 每次重连前计算 delay = Math.min(baseDelay * backoff ** count, 30000)
- count 达到 maxReconnect 后,clearTimeout(reconnectTimer),并触发 onMaxRetry 回调
- 重连成功后自动重置 count 和所有定时器,恢复心跳
对外暴露最小必要接口
闭包返回的对象只包含业务真正需要的方法,不暴露底层细节:
- connect():启动连接,幂等(多次调用只生效一次)
- send(data):自动判断连接状态,未就绪则进队列
- close(force = false):清理所有定时器,关闭 ws,force 为 true 时跳过重连
- on(event, cb):事件订阅(open / message / error / close / reconnecting),内部用 Map 存储,避免重复绑定
这样封装出来的 WebSocket 实例,就像一个黑盒状态机:输入动作(connect/send/close),内部自动流转(connecting → open → heartbeat → closing → reconnecting),外部只需关心事件响应,不用操心状态同步或内存泄漏。

















