用 Promise 封装 IndexedDB 是实现即时通讯离线存储的核心:封装写入、分页查询、同步链及缓存优化,统一错误处理与流程控制,提升可维护性与性能。

用 Promise 封装 IndexedDB 操作,是实现即时通讯消息异步离线存储的核心方式。它让写入、查询、同步等动作变成可链式调用、可错误捕获、可复用的异步流程,避免回调嵌套,也便于与 WebSocket 或 API 请求逻辑对接。
封装消息写入为 Promise
把向 messages 仓库添加一条消息的操作包装成返回 Promise 的函数,内部处理 open、transaction、objectStore、add 等步骤,并统一 reject 错误:
- 使用
autoIncrement: true主键,避免手动管理 ID 冲突 - 确保同时更新
conversations仓库中对应会话的lastMessage和updatedAt - 在
onerror和transaction.onabort中统一 reject,不忽略失败事务
按会话分页查询也返回 Promise
拉取某会话的历史消息(比如最近 50 条)应返回 Promise,内部用 IDBKeyRange.bound() 结合 byConversation 和 byTime 索引高效读取:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 索引必须在
onupgradeneeded中提前创建,版本号递增才生效 - 查询时指定
direction: 'prev'可直接倒序获取最新消息 - 结果数组按 timestamp 排序后 resolve,前端无需二次排序
离线消息同步用 Promise 链衔接
上线后自动发送未发消息,适合用 Promise 链控制顺序和状态:
立即学习“Java免费学习笔记(深入)”;
- 先查出所有
status: 'pending'的消息(Promise 查询) - 逐条调用
fetch('/api/send', { method: 'POST', body })(本身返回 Promise) - 成功后用另一个 Promise 更新 IndexedDB 中该消息的
status和serverId - 任一环节失败,整个链中断并进入
.catch(),保留本地记录供重试
结合缓存优化重复读取
对高频访问的数据(如当前会话的最后 20 条消息),可用 Map 缓存已 resolve 的 Promise,避免反复打开数据库:
- 键名建议用
conversationId + '_recent'这类结构化字符串 - 只缓存成功结果;失败时不存,保证下次能重试
- 清理策略可基于时间(如 5 分钟过期)或手动触发(如收到新消息后清空)

















