gpt4 book ai didi

javascript - 当您在 Chrome 上删除数据库时,indexedDB 不会重置版本——错误或用户错误?

转载 作者:行者123 更新时间:2023-11-29 14:52:05 28 4
gpt4 key购买 nike

如果我将 buggy 设置为 true,以下代码将在 Chrome 35(但不是 Firefox 29)中抛出错误。

因为我是 indexedDB 的新手,所以我想问一下这是否应该起作用。如果我删除数据库并使用 version=1 再次打开它,是否应该调用我的 onupgradeneeded 回调?

<html>
<head>
<script type="text/javascript">
var i = 1000;
var buggy = true;
function open() {
var version = buggy ? 1 : 1001 - i;
var request = indexedDB.open("test", version);
var upgraded = false;
request.onupgradeneeded = function() {
upgraded = true;
console.log("upgraded ok");
}
request.onsuccess = function() {
if (!upgraded) {
throw "Not upgraded";
}
console.log("open ok");
if (--i != 0) { obliterate(); }
}
request.onerror = function() {
throw "Error in open";
}
}

function obliterate() {
var request = indexedDB.deleteDatabase("test");
request.onsuccess = function() {
console.log("delete ok");
open();
}
request.onerror = function(event) {
throw "Error in obliterate.";
}
}

obliterate();
</script>
</head>
<body>
</body>
</html>

在 Chrome 中,使用 buggy=true,我得到:

delete ok test.html:29
upgraded ok test.html:12
open ok test.html:18
delete ok test.html:29
Uncaught Not upgraded

在 Firefox 中它工作正常。

作为旁注,在 Chrome 和 Firefox 中,这运行得非常慢——大约需要 5-10 秒来创建和删除数据库一次。这是正常的/预期的吗?我做错了什么吗?

最佳答案

这是一个用户错误。

IndexedDB 中的删除在 Firefox 和 Chrome 中都非常快。我没有做过任何测量。但客观地说:在 SyncedDB 的测试套件中我在每个 测试之间删除并创建了一个数据库。目前有 67 个测试,它们的执行时间不到一秒。而数据库的删除和创建绝对不是测试中最耗时的部分。

您偶然发现的是 IndexedDB 工作原理的棘手部分之一。 IndexedDB 有数据库连接 的概念。与您的问题相关的部分是:

  • 您可以通过使用open 函数打开数据库来建立连接。该连接由您通过 open 获取的 IDBDatabase 表示。
  • 只要与数据库的连接处于打开状态,就不能删除数据库。
  • 当尝试删除数据库时,将针对连接到数据库的所有打开的 IDBDatabase 对象触发“versionchange”事件。该事件会将 newVersion 属性设置为 null

问题是您在 open 请求 onsuccess 事件处理程序中调用了您的 obliterate 函数。此时您正试图删除一个您有一个开放连接的数据库。这是有问题的,这就是为什么您的示例代码在 Chrome 中不起作用(Firefox 似乎超时连接并完成删除,尽管有很大的延迟)。

修复方法是在 onsuccess 事件处理程序中为 versionchange 事件附加一个监听器。在行 if (--i != 0) { obliterate(); 之后添加这个:

request.result.onversionchange = function(e) {
if (e.newVersion === null) { // An attempt is made to delete the db
e.target.close(); // Manually close our connection to the db
}
};

插入这个你会看到 Firefox 和 Chrome 都不会很快创建和删除 tests 数据库。

关于javascript - 当您在 Chrome 上删除数据库时,indexedDB 不会重置版本——错误或用户错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24111035/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com