WebSocket 收到消息后怎么准确更新未读数?

Zz广利 阅读 14

我用 WebSocket 做了个聊天页面,用户离线时消息会存到数据库,上线后拉取历史消息。但现在有个问题:收到新消息时,我直接 unreadCount++,但如果用户已经打开了聊天窗口(即已读状态),就不该增加未读数。可我没法准确判断当前是否在“已读”状态。

试过加个 isChatOpen 标志位,但切换标签页或组件卸载时容易出错,有时候还是多算了。有没有更可靠的方式同步“是否已读”这个状态?

我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
Des.斯羽
这问题其实挺常见的,我来告诉你个靠谱的方案。

首先在客户端维护一个 lastSeenMessageId,每次用户打开聊天窗口时更新这个值为最新的消息ID。然后服务器端收到新消息时,不用急着去更新未读数,先把这个新消息推送给客户端。

客户端收到消息后判断:如果这条消息的ID大于 lastSeenMessageId,说明是新的未读消息,这时再发请求给服务器增加未读计数。这样即使用户切换标签页或组件卸载也不会出错,因为状态都缓存起来了。

另外别忘了在用户关闭页面前同步一次 lastSeenMessageId 到服务器,用 localStorage 或者 IndexedDB 缓存起来,下次打开直接取出来用。

function handleNewMessage(message) {
if (message.id > lastSeenMessageId) {
// 新消息处理逻辑
updateUnreadCountOnServer();
}
}


这样就能精确控制未读状态了,虽然多了一点网络请求,但比起准确性来说这点性能损耗完全可以接受。
点赞
2026-03-27 16:00