我试图摆脱使用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.resultundefined,因此
   代码错误并在我尝试从中删除密钥后立即退出
   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/

10-10 00:49
查看更多