为什么调用indexedDB.deleteDatabase会阻止我进行任何进一步的交易?

时间:2016-02-01 17:59:17

标签: javascript indexeddb

如果我现在进入我的浏览器控制台(我正在使用Chrome),请在此页面上输入

indexedDB.open("MyDB").onsuccess = function(e) { console.log("success"); };

我立即获得了成功"我的控制台中的消息。我可以根据自己的喜好多次这样做,而且效果很好。但是如果我输入

indexedDB.deleteDatabase("MyDB").onsuccess = function(e) { console.log("success"); };

我没有成功"消息回来。不仅如此,如果我再尝试再次呼叫.open,我也没有成功"消息回来。我怎样才能治愈由.deleteDatabase引起的这种奇怪的疾病,以及到底发生了什么?

(PS:就在我输入这个答案的时候,我认为来自.deleteDatabase的电话的成功"消息终于确实通过了,大约两分钟后我打了电话 - 但是问题是)。

1 个答案:

答案 0 :(得分:8)

每次调用indexedDB.open时,都会建立与数据库的新连接。当您调用deleteDatabase时,所有这些打开的连接都将获得versionchange事件。他们每个人都可以听取该事件并关闭他们的联系以作出回应。这是你的第一选择。如果他们不这样做,indexedDB.deleteDatabase(“whatever”)返回的请求将收到一个被阻止的事件。这就是你的情况。您的第二个选择是收听被阻止的事件并关闭那里的连接:

var request = indexedDB.deleteDatabase("MyDB");
request.onsuccess = function(e) { console.log("success"); };
request.onblocked = function(e) {
  console.log("blocked: " + e);
  // Close connections here
};
request.onerror = function(e) { console.log("error: " + e); };