当前位置:首页 > 文章列表 > 文章 > 前端 > WebSocket消息撤回与实时列表更新教程

WebSocket消息撤回与实时列表更新教程

2026-05-27 11:15:26 0浏览 收藏
本文深入剖析了WebSocket消息撤回功能的完整实现逻辑,强调其绝非前端简单删除DOM的操作,而是一个需服务端广播独立message_recall类型事件、前端基于msgId精准定位更新、并辅以数据库日志记录与离线兜底同步的强一致性协同过程;文章直击初学者常见误区——如复用NEW_MESSAGE类型、依赖DOM顺序删消息、忽略权限校验与状态持久化等,系统性揭示了保障跨终端、断网重连场景下“撤回状态绝对一致”的关键技术要点与落地细节。

WebSocket如何实现消息撤回 实时更新前端列表方法【教程】

消息撤回不是前端删 DOM 就完事,而是服务端广播状态变更、前端精准更新 UI 的协同过程;不校验权限、不保留数据库记录、不处理离线用户,撤回功能上线即翻车。

WebSocket 撤回消息必须用 message_recall 类型广播,不能复用 NEW_MESSAGE

很多初学者把撤回当成“发一条新消息”,直接用 send({ type: 'NEW_MESSAGE', ... }) 推送撤回指令——这会导致前端无法区分原始消息和撤回通知,UI 逻辑混乱甚至重复渲染。

  • 服务端必须定义独立类型,如 message_recall,结构固定:{ "type": "message_recall", "msgId": "abc123", "recallTime": 1715823400, "by": "user_789" }
  • 前端 ws.onmessage 中需显式判断 data.type === 'message_recall',避免和普通消息混用同一套处理分支
  • 若后端用 Spring Boot 的 @OnMessage,注意不要把撤回请求路由到消息入库逻辑里,否则会多写一条无效记录

前端定位并更新 DOM 必须靠 msgId 查找,不能依赖 DOM 顺序或临时索引

messages.value[2]document.querySelectorAll('.msg')[2] 去删第三条消息,是典型竞态陷阱:分页加载、本地搜索、已读标记插入都会打乱顺序。

  • 每条消息 DOM 必须带唯一标识属性,如 data-msg-id="abc123"(Vue 可用 :data-msg-id="msg.id"
  • 收到 message_recall 后,执行 document.querySelector(`[data-msg-id="${msgId}"]`) 精准定位,再添加 recalled class 或替换 innerHTML
  • React/Vue 用户优先走响应式数据流:用 msgIdmessagesRef.currentmessages 数组中 find 并设 isRecalled = true,让框架重渲染

撤回失败或离线用户必须有兜底机制,否则出现“消息已撤回”但对方仍可见

WebSocket 连接断开时发的撤回请求,服务端收不到;用户离线时广播的 message_recall,前端根本没监听到——这两类情况若无补偿,就会产生状态不一致。

  • 服务端收到撤回请求后,必须同步写入一张 message_recall_log 表,含 msg_iduser_idrecall_time
  • 用户上线重连时,前端主动拉取「未同步的状态变更」接口,例如 GET /api/v1/messages/recall-status?since=1715823400
  • 前端内存中维护一个 new Map() 缓存已处理的 msgId,防止网络抖动导致重复收到同一条 message_recall,触发多次 DOM 修改动画

真正难的不是发通知,而是确保每条消息在任意终端、任意网络状态下,其“是否被撤回”的布尔值始终一致;这个一致性必须由服务端单点权威保障,前端只做可信渲染,不做任何状态裁决。

今天关于《WebSocket消息撤回与实时列表更新教程》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

PHP协程高效使用指南PHP协程高效使用指南
上一篇
PHP协程高效使用指南
Excel IF函数使用方法详解
下一篇
Excel IF函数使用方法详解
查看更多
最新文章
作为锚点。JavaScript 也可用于平滑滚动效果。代码示例:返回顶部
CSS(可选平滑">
文章 · 前端   |  49分钟前  |   html
作为锚点。JavaScript 也可用于平滑滚动效果。代码示例:返回顶部
CSS(可选平滑">点击按钮返回顶部,可通过设置锚点实现。使用 标签并绑定 href="#top",在页面顶部设置
作为锚点。JavaScript 也可用于平滑滚动效果。代码示例:
返回顶部
CSS(可选平滑
401浏览 收藏
  • CSS控制滚动条在padding外显示的技巧
    文章 · 前端   |  50分钟前  |  
    CSS控制滚动条在padding外显示的技巧
    176浏览 收藏
  • navigator.onLine 监听网络变化并触发同步
    文章 · 前端   |  54分钟前  |  
    navigator.onLine 监听网络变化并触发同步
    499浏览 收藏
  • 资料下载
    查看更多
    课程推荐
    查看更多
    AI推荐
    查看更多
    相关文章
    微信登录更方便
    • 密码登录
    • 注册账号
    登录即同意 用户协议隐私政策
    返回登录
    • 重置密码