如何检查 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
)
假设我有一个 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
)