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

时间:2017-10-29 03:32:44

标签: javascript indexeddb

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

我已经尝试database.closePending并查看其他属性,但没有看到一个告诉我数据库状态的简单属性。

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

也许我在api中缺少一些简单的功能?是否有一些可观察的实例变量功能,我可以快速轻松地查询以确定状态?

换句话说,您可以改进以下实施方式吗?

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 个答案:

答案 0 :(得分:3)

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

另请注意,API中没有closePending属性。规范文本使用 close pending 标志来表示内部状态,但这不会暴露给脚本。

  

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

为什么呢?这是最可靠的方法。保持额外状态不会导致意外关闭(例如,用户已删除浏览数据,强制关闭连接)尽管onclose处理程序会占用的是什么 - 您需要合并你的第二和第三种方法。 (如果脚本调用close,则不会触发close()

答案 1 :(得分:0)

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

request = indexedDB.open('html5',1);

request.onsuccess = function() {
    console.log('Database connected');
};

示例:

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

关于如何关闭或如何知道indexedDB是否仍处于打开状态:我猜你需要在每个事务上实现所有事件:例如,为了获取控件,你可以获取事件:transaction.onerror,transaction.onabort。 ..如果您需要一些示例解释,我猜您必须创建一个新帖子;)。

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