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

消息撤回不是前端删 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}"]`)精准定位,再添加recalledclass 或替换 innerHTML - React/Vue 用户优先走响应式数据流:用
msgId在messagesRef.current或messages数组中 find 并设isRecalled = true,让框架重渲染
撤回失败或离线用户必须有兜底机制,否则出现“消息已撤回”但对方仍可见
WebSocket 连接断开时发的撤回请求,服务端收不到;用户离线时广播的 message_recall,前端根本没监听到——这两类情况若无补偿,就会产生状态不一致。
- 服务端收到撤回请求后,必须同步写入一张
message_recall_log表,含msg_id、user_id、recall_time - 用户上线重连时,前端主动拉取「未同步的状态变更」接口,例如
GET /api/v1/messages/recall-status?since=1715823400 - 前端内存中维护一个
new Map()缓存已处理的msgId,防止网络抖动导致重复收到同一条message_recall,触发多次 DOM 修改动画
真正难的不是发通知,而是确保每条消息在任意终端、任意网络状态下,其“是否被撤回”的布尔值始终一致;这个一致性必须由服务端单点权威保障,前端只做可信渲染,不做任何状态裁决。
今天关于《WebSocket消息撤回与实时列表更新教程》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!
相关阅读
更多>
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
最新阅读
更多>
-
422 收藏
-
449 收藏
-
105 收藏
-
285 收藏
-
111 收藏
-
文章 · 前端 | 5天前 | 定时器 · 前端 · 性能排查 · 接口请求 · 轮询 · setInterval · setInterval 页面可见性 clearInterval 前端轮询 请求堆积 定时器清理490 收藏
-
253 收藏
-
295 收藏
-
128 收藏
-
365 收藏
-
350 收藏
-
文章 · 前端 | 6天前 | 前端 · javascript · URL参数 · 列表筛选 · 页面状态 · 前端 筛选条件 列表页 history.replaceState URLSearchParams 刷新还原348 收藏
课程推荐
更多>
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习