代码之家  ›  专栏  ›  技术社区  ›  Josh

如何检查indexedDB实例是否打开?

  •  5
  • Josh  · 技术社区  · 8 年前

    假设我有一个indexedDB对象的实例。有没有一种简单的方法来检测对象当前是否处于“打开”状态?

    我试过了 database.closePending 查看其他属性,但没有看到告诉我数据库状态的简单属性。

    • 我希望同步完成这项工作。
    • 对我来说,尝试在数据库上打开事务并检查是否发生异常之类的操作并不是一个合理的解决方案。
    • 我不想维护与数据库实例关联的额外变量。

    换一种方式来说,您能否改进以下实现?

    function isOpen(db) {
      if(db && Object.prototype.toString.call(db) === '[object IDBDatabase]') {
        var names = db.objectStoreNames();
        if(names && names.length) {
          try {
            var transaction = db.transaction(names[0]);
            transaction.abort();
            return true;
          } catch(error) {
          }
        }
      }
    }
    

    还是这种方法?

    var opened = false;
    var db;
    var request = indexedDB.open(...);
    request.onsuccess = function() {
      db = request.result;
      opened = true;
    };
    
    function isOpen(db) {
      return opened;
    }
    
    db.close();
    opened = false;
    

    还是这种方法?

    var db;
    var request = indexedDB.open(...);
    request.onsuccess = function() {
      db = request.result;
      db.onclose = function() {
        db._secret_did_close = true;
      };
    };
    
    function isOpen(db) {
      return db instanceof IDBDatabase && !db.hasOwnProperty('_secret_did_close');
    }
    
    2 回复  |  直到 8 年前
        1
  •  3
  •   Joshua Bell    8 年前

    API中没有任何其他内容可以告诉您连接是否关闭。你列举的可能性是可用的。

    另请注意,没有 closePending 关闭挂起 标志来表示内部状态,但这不会暴露给脚本。

    对我来说,尝试在数据库上打开事务并检查是否发生异常之类的操作并不是一个合理的解决方案。

    为什么?这是最可靠的方法。保持额外状态不会导致意外关闭(例如,用户删除了浏览数据,迫使连接关闭),尽管这是 onclose 处理者会解释-你需要结合你的第二和第三种方法。( close 如果 close()

        2
  •  0
  •   user8556290 user8556290    8 年前

    您应该创建一个 request 通过使用 indexedDB.open 如果连接打开,您将跳转 onsuccess 方法

    request = indexedDB.open('html5',1);
    
    request.onsuccess = function() {
        console.log('Database connected');
    };
    

    例子:

    https://codepen.io/headmax/pen/BmaOMR?editors=1111

    https://developer.mozilla.org/en-US/docs/Web/API/IDBTransaction