Javascript 在类中实现异步indexedDB的干净方法
我有一个加载indexedDB的类。在类中的方法可以访问它之前,我需要预先加载indexedDB。目前,我使用的是一个Javascript 在类中实现异步indexedDB的干净方法,javascript,indexeddb,Javascript,Indexeddb,我有一个加载indexedDB的类。在类中的方法可以访问它之前,我需要预先加载indexedDB。目前,我使用的是一个init()方法,而不是任何其他没有初始化this.db的方法 我正在寻找一种更干净的方式来实现我所拥有的,绝对不是干巴巴的。实际上,每个方法目前都是用下面相同的代码模式实现的 问题是: 另一个方法init()的要求,以便正确地 处理indexedDB的初始化 if(!this.db){段,该段稍后会重复自身 indexedDB提供异步函数。indexedDB.open是一个异
init()
方法,而不是任何其他没有初始化this.db的方法
我正在寻找一种更干净的方式来实现我所拥有的,绝对不是干巴巴的。实际上,每个方法目前都是用下面相同的代码模式实现的
问题是:
另一个方法init()
的要求,以便正确地
处理indexedDB的初始化李>
if(!this.db){
段,该段稍后会重复自身
indexedDB提供异步函数。indexedDB.open
是一个异步函数。看起来您正在尝试以非异步方式使用indexedDB。与其将IDBDatabase变量存储为类实例的属性,不如将其作为解析值返回,并在类外部管理它。
function connect(name, version) {
return new Promise((resolve, reject) => {
const request = indexedDB.open(name, version);
request.onupgradeneeded = myUpgradeHandlerFunction;
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
request.onblocked = () => { console.log('blocked'); };
});
}
function doStuffWithConn(conn, value) {
return new Promise((resolve, reject) => {
const tx = conn.transaction(...);
const store = tx.objectStore(...);
const request = store.put(value);
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
}
async function putValue(value) {
let conn;
try {
conn = await connect(...);
await doStuffWithConn(conn, value);
} catch(exception) {
console.error(exception);
} finally {
if(conn)
conn.close();
}
}
function connect(name, version) {
return new Promise((resolve, reject) => {
const request = indexedDB.open(name, version);
request.onupgradeneeded = myUpgradeHandlerFunction;
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
request.onblocked = () => { console.log('blocked'); };
});
}
function doStuffWithConn(conn, value) {
return new Promise((resolve, reject) => {
const tx = conn.transaction(...);
const store = tx.objectStore(...);
const request = store.put(value);
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
}
async function putValue(value) {
let conn;
try {
conn = await connect(...);
await doStuffWithConn(conn, value);
} catch(exception) {
console.error(exception);
} finally {
if(conn)
conn.close();
}
}