indexeddb可通过手动封装promise简化异步操作:将open、get、add等事件api包装为promise,监听onsuccess/ onerror;事务中每个request单独封装而非整个事务;推荐使用idb库避免重复劳动。

IndexedDB 本身是基于事件的异步 API,不直接返回 Promise,但可以通过手动包装成 Promise 来简化异步流程。核心思路是用 Promise 构造函数包裹 open、add、get 等操作,并监听 onsuccess 和 onerror 事件来 resolve 或 reject。
封装 open 操作为 Promise
数据库打开是最常见的起点,也是最容易出错的环节。需处理版本升级、schema 创建等逻辑。
- 在
onupgradeneeded中创建/修改 objectStore,避免重复执行 - 用
event.target.result获取 DB 实例,作为 resolve 值 - 统一捕获
onerror并 reject,包括权限拒绝、磁盘满等底层错误
把事务操作转为 Promise 链
读写操作必须在事务中进行,而事务本身也依赖事件。常见做法是将整个事务过程封装为一个 Promise:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 调用
db.transaction(...).objectStore(...).get(...)后监听request.onsuccess - 对
add、put、delete同理,用request.result或undefined作为 resolve 值 - 注意:事务的
oncomplete不适合做 resolve 依据,因为请求可能已失败但事务仍“完成”;应以每个 request 的结果为准
使用 async/await 编写清晰逻辑
包装后就能像普通异步函数一样使用,比如:
const db = await openDB('myapp', 1);
const tx = db.transaction('users', 'readonly');
const user = await getRequest(tx.objectStore('users'), 123); // 封装好的 get Promise
console.log(user);
关键点在于:每个 request(如 get/add)都单独包装,而不是整个事务——这样能精准控制错误位置,也便于并发多个请求。
推荐用成熟库减少重复劳动
手写 Promise 包装容易遗漏错误边界或事务生命周期管理。生产环境建议用 idb 这类轻量库:
- 提供
openDB、transaction、store.get等 Promise 接口 - 自动处理版本升级、事务重试、游标遍历等细节
- 体积小(~3KB gzip),无依赖,TypeScript 支持好
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










