假设我有一个 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');
}
API 中没有其他内容可以告诉您连接是否已关闭。你列举的可能性就是可用的。
另请注意,没有closePending
API 中的属性。规范文本使用关闭待处理标志来表示内部状态,但这不会暴露给脚本。
尝试在数据库上打开事务并检查是否发生异常之类的事情对我来说不是一个合理的解决方案。
为什么?这是最可靠的方法。维护额外的状态不会导致意外关闭(例如,用户删除了浏览数据,强制连接关闭),尽管这就是onclose
处理程序会考虑 - 您需要结合第二种和第三种方法。 (close
不会被解雇,如果close()
由脚本调用)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)