我怎么能等到IndexedDB实例关闭?

时间:2013-09-04 11:04:08

标签: javascript html5 indexeddb

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

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

2 个答案:

答案 0 :(得分:1)

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

正如您在IndexedDB API doc中所看到的,close方法不会调度已完成的事件,但数据库删除方法会执行。无论如何,你不需要听这些事件。

答案 1 :(得分: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();
}