用 promise 封装消息发送,通过唯一 msgid 关联请求与回执,支持送达/已读等多状态 resolve 和超时/失败统一 reject,实现 await 可等待、.then 可链式处理、ui 可视化反馈的异步确认机制。

用 Promise 实现即时通讯消息的异步状态确认,核心是把“发消息→等回执→处理结果”这一过程封装成一个可等待、可链式响应、可统一错误处理的 Promise 对象。它不是简单地发完就不管,而是让调用方能自然地用 .then() 或 await 拿到服务器返回的送达/已读状态,同时避免阻塞 UI。
把发送动作包装成 Promise
每次调用发送接口时,不直接返回响应对象,而是返回一个 Promise。这个 Promise 的 resolve/reject 由后端回执或超时机制触发:
- 调用
sendMessage()后立即返回 pending 状态的 Promise - 前端监听长连接(如 WebSocket)中特定类型的回执消息,比如
{ type: 'ack', msgId: 'xxx', status: 'delivered' } - 匹配到对应
msgId时,调用resolve({ status: 'delivered' }) - 若 5 秒内未收到回执,自动
reject(new Error('send timeout'))
用唯一 ID 关联请求与回执
每条消息必须带客户端生成的唯一标识(如 crypto.randomUUID()),这是 Promise 能正确兑现的关键纽带:
- 发送时:
const msgId = crypto.randomUUID(); ws.send({ type: 'message', id: msgId, content: 'hi' }) - Promise 内部用
msgId做 map 缓存:pendingPromises.set(msgId, { resolve, reject }) - 收到回执时:从 map 中取出对应 resolve/reject 并执行,再清理缓存
支持多种确认类型(送达 / 已读 / 已撤回)
不同业务场景需要不同粒度的状态反馈,可在 Promise resolve 的值中体现:
- 送达确认(server received & queued):resolve 返回
{ status: 'sent', timestamp: Date.now() } - 已读确认(对方打开聊天窗口并渲染该消息):后端推送
read: true回执,前端 resolve{ status: 'read', readAt: '2026-08-29T03:40:00Z' } - 失败场景统一 reject:网络中断、对方离线超时、消息被拦截等,都走 reject 分支,便于上层统一 toast 提示
与 UI 组件自然衔接
消息列表中的每条消息可绑定自己的 Promise 状态,实现视觉反馈:
- 刚发送:显示「发送中」图标(pending)
- 收到送达回执:图标变为「对勾」(fulfilled)
- 收到已读回执:图标加粗或变蓝(可基于 resolve 值进一步判断)
- 超时或失败:图标变红 + tooltip 显示「未送达,请重试」(rejected)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











