IndexedDB封装&遇到的问题处理

本文介绍了如何基于单例模式封装IndexedDB,并针对在创建数据库和对象仓库后立即操作数据库时遇到的错误进行了分析和处理。错误原因在于尝试在版本更改事务仍在运行时启动新的事务。解决方案是只在onsuccess事件中返回db实例,确保所有操作都在数据库打开成功之后进行。
摘要由CSDN通过智能技术生成

 

IndexedDB封装及问题处理

1. 封装

    基于单例模式进行indexedDB的封装(源码在最后),包括CURD操作。

   基本知识可先学习浏览器数据库 IndexedDB 入门教程

2. 问题及处理

 遇到问题如下:

    1. 场景: 我在创建数据库及对象仓库(类似于数据库表)后马上去操作数据库(CURD)

      错误信息:  indexedDB.js:156 add data failed DOMException: Failed to execute 'transaction' on 'IDBDatabase': A version change transaction is running。

      

    原因: 创建数据库的流程是 open -> onupgradeneeded(版本升级时调用) -> onsuccess, 遇到此错误是因为试图在版本更改事务仍在运行时启动第二个事务。 我在onupgradeneeded和onsuccess中都返回了db对象,在onupgradeneeded中返回的db其实还处于open的事务中时,我又通过另外一个transaction 去获取数据库的数据,导致现在出现同时两个事务在操作数据库。

    查看打印日志如下:

        

    修改: 只在onsuccess中返回db实例,确保每次都是在打开数据库成功的情况下去操作数据库。

     代码:

 async connectDB(dbName, version, callback = (() => { })) {
        return new Promise((resolve, reject) => {
            let request = this.indexedDB.open(dbName, version)
            request.onerror = (err) => {
                console.error('open indexedDB failed', err)
                // VER_ERR 表明存储在磁盘上的数据库的版本高于你试图打开的版本
                this.db = null
                reject
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值