原生 IndexedDB 用事件回调导致嵌套深、难维护,Promise 封装后可统一用 .then()/.catch() 处理,提升可读性;核心是将 open、事务、CRUD 等操作封装为 Promise,注意事务需在 oncomplete/onerror 中 resolve/reject;推荐轻量库 idb,或手动封装 withTransaction、get、put 等函数,确保事务复用与错误上下文完整。

原生 IndexedDB 使用事件回调(onsuccess、onerror、onupgradeneeded)驱动,嵌套深、错误处理分散、链式逻辑难组织。用 Promise 封装后,所有操作可统一用 .then() 和 .catch() 处理,代码扁平、可读性显著提升。
封装核心:把事件转为 Promise
关键在于将每个异步步骤包装成返回 Promise 的函数,例如打开数据库、执行事务、读写数据等。每一步都 resolve 成功结果,reject 错误信息,避免回调地狱。
- 用
new Promise((resolve, reject) => { ... })包裹indexedDB.open(),在onsuccess中resolve(db),在onerror或onblocked中reject(error) - 对事务中的对象仓库操作(如
store.get()、store.put())同样做 Promise 包装,确保每个原子操作都可 await - 注意:事务本身不能直接 Promise 化,需在事务
oncomplete和onerror中分别 resolve/reject 整个事务流程
推荐轻量封装库:idb
idb 是目前最主流的 Promise 化 IndexedDB 工具,体积小、无依赖、API 清晰。它自动处理版本升级、事务重试和错误映射,省去大量样板代码。
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
- 引入方式:
<script src="https://cdn.jsdelivr.net/npm/idb@7.11.2/build/idb.min.js"></script> - 打开并使用数据库:
const db = await idb.openDB('myDB', 1, { upgrade: (db) => { db.createObjectStore('items'); } }); - 增删改查全支持 Promise:
await db.put('items', { id: 1, name: 'test' });、const item = await db.get('items', 1);
手动封装一个最小可用 get/put 工具函数
若不想引入第三方,可快速封装常用操作。重点是复用同一事务、统一错误上下文,避免重复创建事务实例。
- 定义
withTransaction(db, storeName, mode, fn):接收数据库实例、仓库名、模式('readonly'或'readwrite')和操作函数,返回 Promise -
get(db, storeName, key)内部调用withTransaction,在事务中执行store.get(key) -
put(db, storeName, value, key)同理,支持自定义主键或 autoIncrement - 所有 reject 都携带原始错误和操作上下文(如 store 名、key),便于调试
注意事务生命周期与 Promise 时机
Promise 封装不是“魔法”,仍需遵守 IndexedDB 原则:所有读写必须在事务内进行,且事务在事件循环结束前自动关闭。因此:
- 不要在 Promise resolve 后继续使用已关闭的事务对象
- 避免在
await后再访问transaction.objectStore()—— 应提前获取 store 实例并传入操作函数 - 批量操作建议合并到单个事务中,而非多次
await独立事务,否则性能下降明显
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










