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

How do I check if an indexedDB instance is open?

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

我已经尝试 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');
}

您应该使用 indexedDB.open 创建一个 request,如果连接打开,您将跳转 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 ...如果您需要一些示例说明,我想您必须创建一个新的 post ;).

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

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

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

Doing something like attempting open a transaction on a database and checking if an exception occurs is not a reasonable solution for me.

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