ReadyState 是 WebSocket 的整数枚举属性,共 5 种取值:0(CONNECTING)、1(OPEN)、2(CLOSING)、3(CLOSED)及无效值,需用常量而非数字比较,并配合事件监听与状态校验确保通信可靠。

ReadyState 是 HTML5 中 WebSocket 对象的核心属性,用于反映连接的当前状态。它不是布尔值,而是一个整数枚举,共 5 种取值,每种对应明确的生命周期阶段。正确理解并按需分支处理,是避免“发送失败”“重复连接”“状态误判”等问题的关键。
明确 ReadyState 的 5 种取值及含义
WebSocket 的 readyState 取值固定为以下常量(实际是数字,但建议用常量名增强可读性):
- WebSocket.CONNECTING(值为 0):正在建立连接,尚未完成握手
- WebSocket.OPEN(值为 1):连接已成功建立,可收发消息
- WebSocket.CLOSING(值为 2):连接正在关闭(本地或远程发起关闭流程中)
- WebSocket.CLOSED(值为 3):连接已彻底关闭,不可再用
- 未定义或非标准值:如手动赋值、兼容性异常等,应视为无效状态
典型逻辑分支写法(推荐用 switch + 常量)
避免直接比较数字(如 ws.readyState === 1),应使用 WebSocket 内置常量,提升可维护性与可读性:
switch(ws.readyState) {
case WebSocket.CONNECTING:
console.log('连接中…请勿发送消息');
break;
case WebSocket.OPEN:
ws.send('hello'); // 安全发送
break;
case WebSocket.CLOSING:
case WebSocket.CLOSED:
console.warn('连接不可用,需重连或提示用户');
break;
default:
console.error('未知 readyState 值:', ws.readyState);
}
常见误用场景与规避建议
-
在 CONNECTING 阶段调用 send() —— 会直接抛错:浏览器严格限制,必须等状态变为 OPEN 后才能发数据。建议配合
open事件监听,而非轮询 readyState -
忽略 CLOSING 状态,直接 new WebSocket() 尝试重连:可能导致资源残留或竞态。应在 CLOSED 后再新建,或监听
close事件触发重连逻辑 - 把 readyState 当作“是否在线”的实时指标:它不反映网络通断(如断网时仍可能维持 OPEN 状态数秒),需结合心跳、超时检测和 error/close 事件综合判断
实用辅助函数示例
封装一个安全发送函数,自动处理状态校验:
立即学习“前端免费学习笔记(深入)”;
function safeSend(ws, data) {
if (ws.readyState === WebSocket.OPEN) {
ws.send(data);
} else if (ws.readyState === WebSocket.CONNECTING) {
// 可选择缓存、排队,或丢弃并提示
console.warn('连接未就绪,暂不发送:', data);
} else {
console.error('WebSocket 不可用(状态:', ws.readyState, ')');
}
}



















