Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript IndexedDB DOM IDBDatabase异常11即使在使用oncomplete之后_Javascript_Html_Google Chrome_Indexeddb - Fatal编程技术网

Javascript IndexedDB DOM IDBDatabase异常11即使在使用oncomplete之后

Javascript IndexedDB DOM IDBDatabase异常11即使在使用oncomplete之后,javascript,html,google-chrome,indexeddb,Javascript,Html,Google Chrome,Indexeddb,我对IndexedDB概念非常陌生。我正在尝试将电影列表存储在IndexedDB中并检索它。但由于某种原因,当我试图检索它时,chrome浏览器中出现了DOM IDBDatabase异常11。我尝试使用一个简单的警报来检索它。我还试图通过将警报放在onComplete事件中来检索数据,但这似乎也是一个失败。有人能告诉我我做错了什么吗。下面是我的代码 const dbName = "movies"; var request = indexedDB.open(dbName, 1); request.

我对IndexedDB概念非常陌生。我正在尝试将电影列表存储在IndexedDB中并检索它。但由于某种原因,当我试图检索它时,chrome浏览器中出现了DOM IDBDatabase异常11。我尝试使用一个简单的警报来检索它。我还试图通过将警报放在onComplete事件中来检索数据,但这似乎也是一个失败。有人能告诉我我做错了什么吗。下面是我的代码

const dbName = "movies";
var request = indexedDB.open(dbName, 1);
request.onerror = function(event) {
    alert("Seems like there is a kryptonite nearby.... Please Check back later");
};

request.onsuccess = function(event) {
    var db = event.target.result;
var transaction = db.transaction(["movies"],"readwrite");
var objectStore = transaction.objectStore("movies");
var request1 = objectStore.get("1");
request1.result.oncomplete=function(){
alert("The movie is"+request1.result.name);//This is the place where i get the error
}
};

request.onupgradeneeded = function(event) {
    db = event.target.result;
    var objectStore = db.createObjectStore("movies", { keyPath: "movieid" });
    objectStore.createIndex("name", "name", { unique: false });
    objectStore.createIndex("runtime", "runtime", { unique: false });
    for (var i in movieDataToStore) {
objectStore.add(movieDataToStore[i]);
}};

我仍然不知道上一个程序出了什么问题。我重新编写了上面的程序,效果很好。这是代码。希望这有助于解决这个问题的任何人。另外,如果有人知道上次出了什么问题,请分享你的想法

var db; //database will be stored in this value when success is called
var movieDataToStore = [{ movieid: "1", name: "Keep my Storage Local", runtime:"60"},
            { movieid: "2", name: "Rich Internet Conversations", runtime:"45"},
            { movieid: "3", name: "Applications of the Rich and Famous", runtime:"30"},
            { movieid: "4", name: "All Jump All eXtreme", runtime:"45"}];

window.query = function() {
    db.transaction("movies").objectStore("movies").get("1").onsuccess = function(event) {
        alert("QUERY: CThe first movie is" + event.target.result.name);
    };};

window.onload = function() {
    if (!window.indexedDB) {
        window.alert("Your browser doesn't support a stable version of IndexedDB. Such and such feature will not be available.")
    }
else{
    var request = indexedDB.open("movies", 1);
    request.onerror = function(event) {
          alert("Seems like there is a kryptonite nearby.... Please Check back later");
};

    request.onsuccess = function(event) {
    db = this.result;
    query();
    };

    request.onupgradeneeded = function(event) {
         var db = event.target.result;
         if(db.objectStoreNames.contains("movies")) {
              db.deleteObjectStore("movies");
            }
         var objectStore = db.createObjectStore("movies", { keyPath: "movieid"});
         objectStore.createIndex("name", "name", { unique: false });
          objectStore.createIndex("runtime", "runtime", { unique: false });
          for (var i in movieDataToStore) {
                objectStore.add(movieDataToStore[i]);
              }
    };

        }   
};
  • 我认为在ONUPGRADE上下文中插入数据是不好的做法。您应该在其他时间在一个不相关的函数中单独执行此操作。事实上,尝试在自上次页面加载以来版本增加的数据库上插入数据将自动触发UpgradeRequired事件
  • 虽然许多在线示例将数据库连接句柄(您的db var)推到某个全局作用域变量中,但这也是一种很糟糕的做法,会导致错误。仅作为参数访问回调中的db var。换句话说,openRequest.onsuccess函数应该将db变量传递给查询函数。这还减少了以后出现任何垃圾收集问题并使数据库连接保持打开状态的可能性(indexedDB的设计者允许这样做,但通常应该避免这样做)
  • 如果您的电影ID是整数,我不清楚为什么要将它们作为字符串存储和检索。可以存储整数值。可以将整数传递给store.get
  • 你在不恰当地使用…中。它可以工作,但是for…in用于在对象文本的键上循环(比如var x={key:value})。在迭代movies数组时,使用普通for循环或使用array.foreach
  • 正如您在固定代码中发现的,最好使用request.onsuccess和request.onerror。还有一个transaction.oncomplete。但我不确定是否有请求。oncomplete。所发生的情况是,您正在设置IDBRequestObject的oncomplete属性,但这没有任何作用,因为代码从未触发它
  • DOM 11通常表示您试图访问一个不存在或状态不正确的表。通常情况下,这种情况是由于其他地方的错误造成的,例如在连接时从未被调用。这是令人困惑的,但考虑到代码的设置方式,基本上db是在第一次加载页面时创建的,但之后再也不会创建,因此在开发过程中,如果您进行了更改,但没有增加db版本,您将永远看不到它们