监听websocket message事件需确保连接就绪后绑定回调,区分event.data类型并用try...catch安全解析,正确设置binarytype以匹配服务端数据格式,避免阻塞操作。

监听 WebSocket 的 message 事件,核心是正确绑定回调函数并安全处理服务端数据。不能只写个 onmessage = handler 就完事——时机、格式、容错缺一不可。
必须在连接就绪后绑定监听
WebSocket 实例创建后,连接处于 CONNECTING 状态,此时直接赋值 ws.onmessage 可能失效或被覆盖。更可靠的方式是:
- 用
addEventListener('message', handler),避免后续重复赋值导致监听丢失 - 或统一在
onopen回调中设置:
ws.onopen = () => {
ws.onmessage = event => { /* 处理逻辑 */ };
}; - 不要依赖“实例化后立刻绑定”——握手延迟、竞态条件都可能导致首次推送丢失
要主动解析 event.data 并做类型防护
服务端发来的 event.data 不一定是字符串,也可能是 Blob 或 ArrayBuffer。常见做法是:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 先判断类型:
if (typeof event.data === 'string'),再尝试JSON.parse() - 必须用
try...catch包裹解析过程,防止非法 JSON 导致脚本中断 - 解析后检查关键字段(如
type、payload),对未知type记录日志,不静默忽略
注意 binaryType 设置是否匹配后端格式
如果后端推送的是二进制数据(如 Protobuf、压缩 JSON、图像帧),但前端没改 binaryType,event.data 会变成乱码字符串,甚至触发 onerror:
- 连接建立后立即设置:
ws.binaryType = 'arraybuffer'(对应 ArrayBuffer)或'blob' - 若后端明确用字符串 JSON,可不设,但建议显式写上
ws.binaryType = 'text'表明意图 - 别让前端“猜”后端格式——协议文档或接口约定必须明确 data 类型
避免在 onmessage 中做耗时或阻塞操作
高频消息下,同步执行大量 DOM 更新或复杂计算会导致页面卡顿:
- 用
requestIdleCallback()延迟非紧急更新 - 对高频消息做节流(例如每 100ms 最多处理一次)
- 复杂业务逻辑尽量拆到 Web Worker 中处理










