SSE(Server-Sent Events)完整状态
·
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 握手成功,服务端持续推送事件流
- 可以正常监听
message、error、自定义事件 - 绝大多数业务运行时处于该状态
CLOSED 连接永久关闭
两种场景:
- 客户端手动调用
source.close()主动关闭; - 服务端正常结束流、返回非200状态码、网络异常且达到重连上限。
关闭后不会自动重连。
3. 配套事件(和状态联动)
onopen:状态变为OPEN(1)时触发onmessage:状态为OPEN时收到服务端消息触发onerror:网络断开、服务端报错、跨域等异常触发- 短暂断连:状态切回
CONNECTING(0),浏览器自动重试 - 调用 close() / 致命错误:状态变为
CLOSED(2),停止重连
- 短暂断连:状态切回
补充区分:不要混淆两种“状态”
- readyState:客户端连接状态(上面核心三态)
- HTTP 响应状态码:服务端必须返回
200 OK,且响应头:
非200会直接触发 error 并关闭连接。Content-Type: text/event-stream Cache-Control: no-cache Connection: keep-alive
简易代码示例
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('连接彻底关闭');
}
};
更多推荐




所有评论(0)