websocket的readystate是只读整数属性,对应四个状态常量:0(connecting)、1(open)、2(closing)、3(closed),应使用websocket.connecting等静态属性而非数字硬编码来判断,且需结合事件监听而非仅依赖轮询。

WebSocket 的 readyState 是一个只读属性,用来反映当前连接所处的生命周期阶段。它不是布尔值,而是整数,对应四个明确的状态常量,直接通过比较数值或使用 WebSocket 构造函数上的静态属性来判断最稳妥。
readyState 的四个取值及含义
WebSocket 实例的 readyState 有且仅有以下四种状态:
- 0(WebSocket.CONNECTING):正在建立连接,TCP 握手已完成,但 WebSocket 协议升级尚未完成,还未收到服务端确认响应。
- 1(WebSocket.OPEN):连接已成功建立,可以正常发送和接收消息。
- 2(WebSocket.CLOSING):连接正在关闭中,已收到关闭请求(本地或服务端发起),但尚未完全断开。
- 3(WebSocket.CLOSED):连接已关闭或连接尝试失败(例如网络不通、服务端拒绝、URL 错误等)。
判断 readyState 的推荐写法
不要硬写数字(如 ws.readyState === 1),应优先使用 WebSocket 内置常量,提高可读性和健壮性:
ws.readyState === WebSocket.CONNECTINGws.readyState === WebSocket.OPENws.readyState === WebSocket.CLOSINGws.readyState === WebSocket.CLOSED
常见误用是用 if (ws.readyState) 或 !ws.readyState 做真假判断——这不可靠,因为 CONNECTING(0)会被当作 false,但此时连接仍在进行中,并非错误状态。
实际使用中的关键注意点
readyState 只反映“当前瞬间”的状态,不能替代事件监听:
- 仅靠轮询
readyState并不可靠,应结合open、message、close、error事件处理逻辑。 - 在
open事件触发后,readyState才稳定为OPEN;在此之前发消息可能被丢弃。 - 连接关闭后,
readyState变为CLOSED,但不会自动重连——需手动创建新实例。 - 如果
readyState长时间停留在CONNECTING,大概率是网络问题或服务端未响应,可设超时主动报错。
一个简单但完整的状态检查示例
比如发送消息前,安全做法是:
if (ws.readyState === WebSocket.OPEN) {
ws.send('hello');
} else if (ws.readyState === WebSocket.CONNECTING) {
console.log('连接尚未就绪,可选择等待或缓存消息');
} else {
console.warn('WebSocket 不可用,当前状态:', ws.readyState);
}
更进一步,可封装成工具函数,配合 Promise 和超时控制,避免阻塞式等待。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











