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

Jac*_*k M 5 javascript indexeddb

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

indexedDB.open("MyDB").onsuccess = function(e) { console.log("success"); };
Run Code Online (Sandbox Code Playgroud)

我立即在控制台中收到"成功"消息.我可以根据自己的喜好多次这样做,而且效果很好.但是如果我打字的话

indexedDB.deleteDatabase("MyDB").onsuccess = function(e) { console.log("success"); };
Run Code Online (Sandbox Code Playgroud)

我没有得到"成功"的消息.不仅如此,如果我再次尝试.open再次呼叫,我也不会收到"成功"消息.我怎样才能治愈这种奇怪的疾病.deleteDatabase,以及究竟发生了什么?

(PS:正如我完成了这个答案的输入,我认为来自呼叫的"成功"消息.deleteDatabase最终确实通过了,大约两分钟后我打了电话 - 但问题仍然存在).

dgr*_*gan 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); };
Run Code Online (Sandbox Code Playgroud)

  • 当你说“这里有密切的联系”时,我到底该怎么做呢?我的问题是我没有任何对开放连接的引用。事实上,就我而言,即使删除数据库请求是页面加载时运行的第一个代码(我正在制作 chrome 扩展),我也会遇到此问题。 (2认同)
  • 那么这个事件是如何被解锁的呢?等待 2 分钟让它完成是有点愚蠢的。 (2认同)