心跳检测函数的自愈能力指网络异常时自动重试、退避恢复、防雪崩;闭包封装状态(失败次数、延迟、时间戳等),提供启停接口与健康反馈,实现内聚可控的容错机制。

心跳检测函数的“自愈能力”,本质是当网络抖动、临时断连或服务端短暂不可用时,函数不报错退出,而是自动重试、平滑退避、恢复连接并继续上报,同时避免雪崩式重连。闭包是实现这一能力的理想工具——它能持久保存状态(如重连次数、上次成功时间、退避延迟),又不污染全局作用域。
封装可记忆的状态变量
利用闭包捕获并维护心跳生命周期中的关键状态:失败计数、指数退避延迟、是否正在重连中、最后成功时间戳等。这些变量对外不可见,但每次调用都可读写,天然线程安全(单实例场景下)。
- 初始化时设定基础间隔(如 3000ms)、最大重试次数(如 5 次)、退避因子(如 1.5)
- 每次失败后更新 delay = Math.min(maxDelay, baseDelay * Math.pow(factor, failCount))
- 成功上报后重置 failCount = 0,并记录 lastSuccess = Date.now()
内置带退避的自动重试逻辑
闭包内定义一个私有重试函数,配合 setTimeout 实现非阻塞延迟重试。它不依赖外部定时器管理,也不需要用户手动清除/重启,所有调度逻辑被封装在函数内部。
- 首次调用启动心跳,后续失败自动触发 setTimeout(retry, currentDelay)
- 每次重试前检查是否已恢复(例如 lastSuccess 近期有效),可提前终止退避
- 达到最大重试次数后进入“观察期”:延长间隔(如 60s)静默探测,而非直接放弃
暴露可控的启停与状态接口
闭包返回一个对象,提供 clean、start、stop、getStatus 等方法。这些方法共享同一套状态,用户可随时干预,但不影响底层自愈逻辑的连续性。
- start():若未运行则启动;若因失败暂停,则从当前 delay 继续重试
- stop():清除所有 pending timeout,但保留 failCount 和 lastSuccess,便于后续 resume
- reset():清空状态,回到初始配置,适合服务端切换或主动恢复场景
集成轻量级健康反馈机制
在闭包中嵌入一个小型状态机(如 'idle' → 'pending' → 'success' / 'failed'),配合回调或 Promise resolve/reject 向外通知当前心跳健康度,但不中断自愈流程。
- 每次请求发出时触发 onHeartbeat('pending')
- 响应成功时触发 onHeartbeat('success', { latency })
- 连续失败达阈值时触发 onHeartbeat('degraded'),但内部仍继续重试
不复杂但容易忽略:真正的自愈不是“不断重发”,而是在失败中学习节奏、识别恢复信号、避免干扰业务主流程。闭包让这一切状态和策略内聚、可复用、无副作用。










