Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在类中实现异步indexedDB的干净方法_Javascript_Indexeddb - Fatal编程技术网

Javascript 在类中实现异步indexedDB的干净方法

Javascript 在类中实现异步indexedDB的干净方法,javascript,indexeddb,Javascript,Indexeddb,我有一个加载indexedDB的类。在类中的方法可以访问它之前,我需要预先加载indexedDB。目前,我使用的是一个init()方法,而不是任何其他没有初始化this.db的方法 我正在寻找一种更干净的方式来实现我所拥有的,绝对不是干巴巴的。实际上,每个方法目前都是用下面相同的代码模式实现的 问题是: 另一个方法init()的要求,以便正确地 处理indexedDB的初始化 if(!this.db){段,该段稍后会重复自身 indexedDB提供异步函数。indexedDB.open是一个异

我有一个加载indexedDB的类。在类中的方法可以访问它之前,我需要预先加载indexedDB。目前,我使用的是一个
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();
      }
    }