IndexedDB的使用
indexedDB的底层是sqlite3实现的
如何获取一个数据库实例呢?通过indexedDB.open(name, version);获取一个请求,类型是IDBOpenDBRequest,当请求成功的时候触发回调。返回一个数据库实例,类型为IDBDatabase。https://developer.mozilla.org/zh-CN/docs/Web/API/IndexedDB_API
/** * * @returns {Map<string, number>} */constgetDBVersionMap=async()=>{constmap=newMap();constdbs=awaitindexedDB.databases();dbs.forEach(val=>{map.set(val.name,val.version);});returnmap;}/** * * @param {string} name * @returns {Promise<IDBDatabase>} */constgetIndexedDB=async(name)=>{constmap=awaitgetDBVersionMap();constversion=map.has(name)?map.get(name)+1:1;constreq=indexedDB.open(name,version);returnnewPromise((resolve,reject)=>{req.addEventListener("success",e=>{/** * @type {IDBDatabase} */constdb=e.target.result;db.addEventListener("versionchange",e=>{db.close();});resolve(db);});req.addEventListener("error",e=>{reject(e);})});}为什么db需要注册一个versionchange的事件,并且关闭实例呢,因为当数据库升级的时候,旧版本的实例没有关闭的话,新版本就无法创建,阻塞住。