可通过封装 websocket 构造异步生成器,将 message 事件转为按需 yield 的可迭代消息流,支持过滤、转换、错误处理与连接中断响应,实现拉式消费。

可以通过封装 WebSocket 连接与消息事件,构造一个异步生成器函数,让每次 yield 返回一条解析后的消息,再用 for await...of 循环逐条消费。这种方式把“推”式回调转为“拉”式迭代,逻辑更线性、错误更可控。
创建可迭代的 WebSocket 消息流
核心是将 message 事件转化为可等待的 Promise,并在生成器中循环等待、解析、产出。关键点在于:每次只 yield 一条消息;连接关闭时自动退出循环;异常需抛出供外部捕获。
- 使用
addEventListener监听message,配合Promise暂存单次响应 - 生成器内部用
while循环持续监听,直到socket.readyState === WebSocket.CLOSED - 对每条
event.data做基础解析(如JSON.parse),失败时yield原始数据或抛错 - 连接关闭或报错时,清理监听器并终止生成器
支持过滤与转换的链式处理
异步生成器天然支持组合。可在基础消息流之上,再定义一个异步生成器,只 yield 符合条件的消息,实现类似流式管道的效果。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
- 例如:定义
async* filterByType(type),遍历上游消息流,仅对message.type === type的项执行yield - 也可添加
map类操作,如async* toUpperCase()对文本消息做转换 - 多个生成器可嵌套调用,但注意避免无限制缓存——异步生成器本身不预加载,仍是按需拉取
处理错误与连接中断
WebSocket 可能因网络、服务端关闭或协议错误中断,生成器必须显式响应这些状态,否则 for await 会永久挂起。
- 监听
error和close事件,在对应 handler 中reject当前 pending 的 Promise - 生成器内
await失败时,应throw错误,使外层try...catch能捕获 - 建议在生成器开头检查
socket.readyState,非OPEN状态直接抛出连接异常 - 实际使用时,常配合
finally块或AbortController实现资源清理
搭配 FastAPI 或 httpx 客户端的注意事项
若后端用 FastAPI 提供 WebSocket 接口,或前端用 httpx.AsyncClient 连接,需注意协议细节兼容性,尤其涉及二进制帧或分片场景。
- 文本消息默认可直接
yield event.data;二进制消息需先转为Uint8Array或Blob再处理 - 服务端分片发送时,客户端可能收到多个
message事件,需自行拼接并校验完整性(如依据自定义帧头) - httpx 的
websocket_receive_text()/websocket_receive_bytes()是 awaitable,可直接用于生成器yield,无需额外 Promise 封装 - 设置合理超时和重连机制,避免单次连接失败导致整个迭代流程中断










