闭包本身不是自愈函数,但可封装状态与逻辑构建具备自动恢复能力的长连接任务控制器;其核心是封存WebSocket实例、重试上下文等私有变量,确保状态一致性,并配合退避重连、心跳检测、任务队列挂起与恢复等机制实现网络自愈。

闭包本身不是“自愈函数”,也不能直接实现网络自愈。但利用闭包封装状态与逻辑,配合重连策略、连接状态管理、任务队列和错误恢复机制,可以构建出具备自动恢复能力的长连接任务控制器——这才是实践中常说的“自愈函数”本质。
用闭包封存连接状态与重试上下文
闭包的核心价值在于把 WebSocket 实例、重连计时器、待发消息队列、失败回调等私有变量锁在作用域内,外部无法随意篡改,确保状态一致性。
- 定义一个外层函数(如 createResumableWS),内部声明 instance、pendingQueue、reconnectCount 等变量
- 内层返回的对象只暴露 send、connect、resumePending 等受控方法
- 当连接断开时,send 不报错丢弃,而是将数据推入 pendingQueue;重连成功后自动调用 resumePending 重发
结合网络波动特征设计轻量级自愈逻辑
真正的“自愈”不靠魔法,而靠对网络异常模式的响应设计。例如:短暂抖动(5s)需退避重试;DNS 失败则应延迟并降级备用地址。
- 在 onclose 中判断 event.code 和 event.reason,区分是主动关闭、超时还是网络中断
- 使用指数退避(如 1s → 2s → 4s → 最大 30s)控制重连节奏,避免雪崩
- 引入“健康心跳”:每 15 秒发一次 ping 消息,超时两次未响应即触发本地断连+重连流程
任务挂起与恢复的关键细节
所谓“被挂起的任务”,通常指 send 调用时连接未就绪。闭包让这个过程可追溯、可续传,而不是静默失败。
- 每个待发消息建议携带唯一 id 和 timestamp,便于去重与超时清理
- pendingQueue 推荐用数组+索引游标(非 shift/pop),避免频繁内存搬运
- 恢复发送前检查 readyState === WebSocket.OPEN,并加 try-catch 包裹 send,失败仍回推队列尾部
- 可选:为高优任务设置 immediate: true 标志,连接恢复后优先发送
不依赖全局变量,确保模块间隔离
多个业务模块(如聊天、通知、实时行情)若共用同一长连接,必须避免互相干扰。闭包 + ESM 导出是安全方案。
- 每个连接实例由独立调用 createResumableWS() 生成,彼此状态完全隔离
- 通过命名导出(如 export const chatWS = createResumableWS())而非挂 window.ws,避免污染与覆盖
- 在 TypeScript 中可用 declare module 扩展类型,但运行时实例仍由闭包函数创建,保障封装性

















