simple2k13
Version:
some simple functions
93 lines • 3.44 kB
JavaScript
/** @format */
class IndexedDB {
db;
dbName;
storeName;
version;
constructor(dbName, storeName, version = 1) {
this.db = undefined;
this.dbName = dbName;
this.storeName = storeName;
this.version = version;
}
open() {
return new Promise((resolve, reject) => {
const myIndexedDB =
// @ts-ignore
indexedDB || webkitIndexedDB || mozIndexedDB || msIndexedDB;
if (!myIndexedDB) {
const error = new Error("IndexedDB is not supported");
console.warn(error);
return reject(error);
}
const res = myIndexedDB.open(this.dbName, this.version);
res.onsuccess = (event) => {
// @ts-ignore
this.db = event.target?.result; // 数据库对象
resolve(event);
};
res.onerror = function (event) {
reject(event);
console.log("数据库打开失败...");
};
res.onupgradeneeded = (event) => {
// 数据库创建或升级的时候会触发
const storeName = this.storeName;
// @ts-ignore
const db = event.target?.result;
if (!db.objectStoreNames.contains(storeName)) {
db.createObjectStore(storeName); // 创建表
}
};
});
}
dispatch(func, options = {}, ...args) {
const { mode = "readwrite", more = false } = options;
return new Promise((resolve, reject) => {
try {
const objectStore = this.getObjectStore(mode);
const storePrototype = objectStore[func];
if (!(func in objectStore)) {
return reject(`${func} is undefined, reference resources:https://developer.mozilla.org/zh-CN/docs/Web/API/IDBObjectStore`);
}
if (typeof storePrototype === "function") {
// @ts-ignore
const res = objectStore[func](...args);
res.onsuccess = (event) => {
// @ts-ignore
const result = event.target?.result;
resolve(more
? {
res,
event,
result,
objectStore,
bd: this.db,
}
: result);
};
res.onerror = reject;
}
else {
resolve(storePrototype);
}
}
catch (error) {
reject({
message: error,
arguments: { func, options, args },
});
}
});
}
getObjectStore(mode = "readwrite") {
if (!this.db) {
throw new Error("No database connection available , please use IndexedDB=>open to connect");
}
const transaction = this.db.transaction([this.storeName], mode); // 事务
const objectStore = transaction.objectStore(this.storeName); // 仓库对象
return objectStore;
}
}
export default IndexedDB;
//# sourceMappingURL=index.js.map