SSE(Server-Sent Events)完整状态

SSE 客户端 EventSource 对象自带 readyState 表示连接状态,共 4 个枚举值:

1. 常量对照表

常量名 数值 状态说明
EventSource.CONNECTING 0 连接正在建立中
EventSource.OPEN 1 连接成功、正常通信
EventSource.CLOSED 2 连接已关闭
EventSource.IDLE 3 部分浏览器扩展:空闲等待重连(标准规范无此值)

2. 各状态详细解释

CONNECTING 正在连接

  • 刚 new EventSource() 发起请求、或断开后自动重连阶段
  • 浏览器正在和服务端建立长连接
  • 此时还收不到消息,等待握手完成

OPEN 连接已打开(正常工作)

  • HTTP 握手成功,服务端持续推送事件流
  • 可以正常监听 messageerror、自定义事件
  • 绝大多数业务运行时处于该状态

CLOSED 连接永久关闭

两种场景:

  1. 客户端手动调用 source.close() 主动关闭;
  2. 服务端正常结束流、返回非200状态码、网络异常且达到重连上限。
    关闭后不会自动重连。

3. 配套事件(和状态联动)

  1. onopen:状态变为 OPEN(1) 时触发
  2. onmessage:状态为 OPEN 时收到服务端消息触发
  3. onerror:网络断开、服务端报错、跨域等异常触发
    • 短暂断连:状态切回 CONNECTING(0),浏览器自动重试
    • 调用 close() / 致命错误:状态变为 CLOSED(2),停止重连

补充区分:不要混淆两种“状态”

  1. readyState:客户端连接状态(上面核心三态)
  2. HTTP 响应状态码:服务端必须返回 200 OK,且响应头:
    Content-Type: text/event-stream
    Cache-Control: no-cache
    Connection: keep-alive
    
    非200会直接触发 error 并关闭连接。

简易代码示例

const es = new EventSource('/stream');
console.log(es.readyState); // 初始 0 CONNECTING

es.onopen = () => {
  console.log('连接成功,状态:', es.readyState); // 1
};
es.onerror = () => {
  if (es.readyState === 0) {
    console.log('断开,正在重连');
  } else if (es.readyState === 2) {
    console.log('连接彻底关闭');
  }
};
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐