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

Why does calling indexedDB.deleteDatabase prevent me from making any further transactions?

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

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

我的控制台立即收到 "success" 消息。我可以多次执行此操作,而且效果很好。但是如果我输入

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

我没有收到 "success" 消息。不仅如此,如果我再次尝试调用 .open,我也不会收到任何 "success" 消息。 .deleteDatabase引起的这种怪病怎么治,到底是怎么回事?

(PS: 就在我输入完这个答案后,我认为 "success" 调用 .deleteDatabase 的消息终于传来了,大约在我发出请求后两分钟打电话 - 但问题仍然存在)。

每次调用 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); };