我试图摆脱使用indexedDB存储数据客户端的困扰。
考虑以下代码:
function queryURL(message, sender)
{
chrome.contextMenus.removeAll();
var openRequest = indexedDB.open("Tags",1);
openRequest.onsuccess = function(event){
var queryURL = message['host'];
var db = event.target.result;
var objectStore = db.transaction("domains").objectStore("domains");
var query = objectStore.get(queryURL);
query.onsuccess = function(event){
alert(query.result);
delete query.result["domain"];
createMenuItems(query.result);
available_commands=request.result;
};
db.onerror = function(event){
console.log("an error bubbled up during a transaction.");
};
};
openRequest.onerror = function(event){
console.log("error opening DB");
};
}
我不完全了解查询中应该发生什么。
无论查询的密钥是否在数据库中,结果都是相同的:
query.onsuccess()
运行,而query.result
是undefined
,因此代码错误并在我尝试从中删除密钥后立即退出
query.result
。如果找不到密钥,则
query.onsuccess()
不应为运行,对吗?
如果找到了密钥,则
query.result
应保存具有以下内容的对象:对应于那个钥匙,对吗?
如果有帮助,下面是我用来初始化数据库的代码:
const db_name="Tags";
var request = window.indexedDB.open(db_name, 1);
var tags = [
//codes: 0 - markdown wrap tag
// 1 - HTML wrap tag
// 2 - single tag
{ domain: "www.youtube.com",
bold:["*",0],
strikethrough:["-",0],
italic:["_",0]
},
{ domain: "www.stackoverflow.com",
bold:["<strong>",1],
italic:["<em>",1],
strikethrough:["<del>",1],
superscript:["<sup>",1],
subscript:["<sub>",1],
heading1:["<h1>",1],
heading2:["<h2>",1],
heading3:["<h3>",1],
blockquote:["<blockquote>",1],
code:["<code>",1],
newline:["<br>",2],
horizontal:["<hr>",2]
}
];
request.onerror = function(event) {
alert("Error opening the database");
};
request.onupgradeneeded = function(event) {
var db = event.target.result;
alert("I'm doing stuff!");
var objectStore = db.createObjectStore("domains", {keyPath: "domain" });
objectStore.createIndex("domain", "domain", { unique: true });
objectStore.transaction.onComplete = function(event) {
var domanStore=db.transaction("domains","readwrite").objectStore("domains");
for(var i in tags)
{
domainStore.add(tags[i]);
}
}
};
以下是我正在使用的资源的一些链接:
Using IndexedDB
IDBObjectStore
IDBRequest
最佳答案
发现结果为空或未定义是成功的查询。所以是的,您可以通过onsuccess
调用result === undefined
。onerror
仅在发生问题时保留,例如您提供了无效的密钥。
从IDBObjectStore.get
docs:
注意:对于以下情况,此方法产生相同的结果:a)数据库中不存在的记录,以及b)具有未定义值的记录。为了区分这些情况,请使用相同的键调用openCursor()
方法。如果记录存在,该方法将提供一个游标,否则将不提供任何游标。
关于javascript - 为什么对IDBObjectStore.get()的此调用导致困惑的行为?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28006085/