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

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

我立即在控制台中收到“成功”消息。我可以做很多次,而且效果很好。但是如果我输入
indexedDB.deleteDatabase("MyDB").onsuccess = function(e) { console.log("success"); };

我没有收到“成功”消息。不仅如此,如果我再尝试再次调用.open,也不会收到“成功”消息。我该如何治愈这种由.deleteDatabase引起的奇怪疾病,究竟发生了什么?

(PS:就像我输入完这个答案一样,我认为从通话到.deleteDatabase的“成功”消息终于通过了,大约是在我拨打电话后的两分钟,但问题仍然存在)。

最佳答案

每次调用indexedDB.open时,都会建立与数据库的新连接。当您调用deleteDatabase时,所有这些打开的连接都将获得版本更改事件。他们每个人都可以侦听该事件并作为响应关闭其连接。那是您的第一选择。如果没有,则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); };

08-28 12:53