5

IndexedDB 方法 close是同步的,我怎样才能等到 close 完成?我的用例是在自动化测试之后关闭 IndexedDB,然后在下一次测试之前,删除数据库并重新打开它。

我看到的问题是有时indexedDB.deleteDatabase会触发被阻止的事件,因为数据库尚未异步关闭(正如您从我链接到的 deleteDatabase 的文档中看到的那样)。我不完全确定的是,在这种情况下是否仍会删除数据库,尽管已触发阻止事件。

4

2 回答 2

1

您无需等待关闭完成的事件,只需关闭、删除数据库并重新打开即可。

正如您在 IndexedDB API 文档中看到的那样,close 方法不会调度完成事件,但数据库删除方法会。无论如何,您不需要听这些事件。

于 2013-09-05T02:05:12.157 回答
1

如果事务仍在运行,则无法关闭数据库,这可能就是原因。你有这样的事情吗?

IndexedDB.open("mydb").onsuccess = function(e) {
  db = e.target.result;
  trans = db.transaction("someobjectstore");
  os = trans.getObjectStore("someobjectstore");
  os.put("blah");
  db.close();
}

如果是这样,则可能是事务仍在运行。

无论如何,如果您收到被阻止的事件,数据库仍将被删除......当所有连接都关闭时。

当您实例化与数据库的连接时,请确保您已将 onversionchange 处理程序分配给生成的数据库。这可以帮助调试正在发生的事情。

IndexedDB.open("mydb").onsuccess = function(e) {
  db = e.target.result;
  db.onversionchange = function(e) {
    console.log("got versionchange event: " + e);
  }
  trans = db.transaction("someobjectstore");
  os = trans.getObjectStore("someobjectstore");
  os.put("blah");
  db.close();
}
于 2013-09-05T14:40:46.170 回答