主动调用 eventsource.close() 是客户端立即断开 sse 连接的最直接方式,调用后连接即关闭、不可复用,需手动清理监听器并新建实例才能重连。

在 JavaScript 中使用 SSE(Server-Sent Events)时,主动调用 close() 是释放连接、避免资源浪费的最直接方式。它不依赖服务器响应或超时,而是由客户端立即发起断连操作,适用于用户离开页面、切换功能、或手动停止监听等场景。
EventSource.close() 的基本用法
创建 EventSource 实例后,随时可调用其 close() 方法终止连接:
- 调用后,浏览器会立即关闭底层 HTTP 连接,不再接收新事件;
- 已触发但尚未执行的
onmessage或事件监听器仍会运行,但后续数据不会再到达; - 该操作不可逆——关闭后不能复用原实例,需重新 new EventSource 才能重建连接。
示例:
const es = new EventSource('/api/notifications');es.onmessage = e => console.log(e.data);
// …… 一段时间后主动关闭
es.close(); // ✅ 此刻连接即断开
关闭前清理监听器更安全
仅调用 close() 不会自动移除绑定的事件处理器,若实例未被垃圾回收,可能引发内存泄漏(尤其在单页应用中反复创建/销毁时):
- 建议在
close()前,显式解除所有addEventListener绑定; - 若使用
onmessage/onerror等属性赋值方式,可将其设为null; - 将
EventSource实例置为null或脱离作用域,有助于 GC 回收。
推荐写法:
const es = new EventSource('/api/stream');es.onmessage = handleData;
es.onerror = handleError;
// 关闭时一并清理
function cleanup() {
es.close();
es.onmessage = null;
es.onerror = null;
es = null;
}
配合页面生命周期自动关闭
避免忘记关闭导致后台持续连接,可结合浏览器事件自动管理:
-
beforeunload:用户关闭标签页或刷新前触发,适合做兜底关闭; -
visibilitychange:页面切到后台时关闭,回到前台再重建(节省后台带宽); - 组件卸载时(如 React useEffect cleanup、Vue onUnmounted)调用
close()。
例如:
window.addEventListener('beforeunload', () => {if (es && es.readyState === EventSource.OPEN) {
es.close();
}
});
注意 close() 后的状态与重连逻辑
close() 并不会重置 readyState,它保持为 0(CLOSED),且不会触发 onerror;
- 如果业务需要“暂停-恢复”,不要依赖
close()+ 重启,而应设计开关逻辑(如用标志位忽略消息); - 若需重连,必须新建
EventSource实例,旧实例不可复用; - 服务端无需特殊处理——HTTP 连接断开后,自然释放对应会话资源(前提是服务端有合理的心跳或超时机制)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











