JavaScript中SSE自动恢复需主动接管连接生命周期:禁用默认重连,结合网络状态、连接状态、服务端ID机制和渐进式重试策略,实现有感知、可控制、不干扰用户的恢复体验。

JavaScript 中 SSE 处理网络中断时的自动恢复与重试,核心不是依赖浏览器默认行为,而是主动接管连接生命周期:禁用不可控的自动重连,结合网络状态、连接状态、服务端 ID 机制和渐进式策略,实现有感知、可控制、不干扰用户的恢复体验。
禁用默认重连,手动控制重建时机
浏览器默认约 3 秒后自动重连,但无提示、无节奏控制、无法暂停。应主动关闭这一行为:
- 创建 EventSource 时不设置 retry 字段(避免服务端干扰前端逻辑)
- 在
onerror回调中立即调用es.close()清除旧实例 - 使用
setTimeout延迟新建,初始延迟 2 秒,每次失败后翻倍(2s → 4s → 8s),上限建议 30 秒 - 每次重建前检查
navigator.onLine,为 false 时跳过重试,仅显示“⚠️ 检测到离线,已暂停重连…”
区分异常断连与正常关闭
仅对真正意外中断做恢复提示,避免误触发:
- 定义一个 isManuallyClosed 标志位,调用
es.close()前设为true - 在
onerror中判断:es.readyState === 0 && !isManuallyClosed才视为需提示的异常 - 若首次连接就失败(
readyState始终为 0),显示“正在连接…”而非“正在恢复”,避免语义误导
用轻量 UI 提示连接状态变化
用户需要知道发生了什么,但不能打断操作:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
- 采用右上角非阻塞 Toast 或顶部固定状态栏,文案带图标和动态感:“⚠️ 网络不稳定,正在尝试重新连接…”
- 连接成功后自动消失,并短暂显示绿色提示:“✅ 已恢复连接”
- 连续 3 次重连失败后,升级提示为:“❌ 无法连接服务器,请检查网络或点击重试”,并提供“重试”按钮
- 重试按钮点击后,重置重试计数器,调用新
EventSource实例
利用 id + Last-Event-ID 实现数据无缝续传
UI 恢复只是表层,数据一致性才是关键:
- 服务端每条消息必须带单调递增的 id: 字段(如时间戳或自增整数),且独占一行
- 浏览器自动将最后收到的 id 放入请求头
Last-Event-ID,无需前端手动读写 - 服务端收到该 header 后,只推送 ID 严格大于它的新事件;若 ID 无效(如页面刷新),可 fallback 返回最近 N 条作为兜底
- 客户端可配合 URL 参数增强可靠性,例如
/events?since=1717023456,服务端优先解析参数再 fallback 到 header
不复杂但容易忽略

















