如何等待 IndexedDB 实例关闭?

5

IndexedDB方法close 是同步的, 我该如何等待close完成?我的用例是在自动化测试后关闭IndexedDB,然后在下一个测试之前删除数据库并重新打开它。

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

2个回答

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处理程序给结果db。这可以帮助调试问题。
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();
}

它只是偶尔发生,我认为这只是因为异步关闭操作尚未完成。如果您正确地认为删除仍然成功,那么我就不需要知道何时关闭已完成(并且可以忽略阻塞事件)。 - aknuds1

1
您不需要等待关闭完成事件,只需关闭、删除数据库并重新打开它即可。
正如您在IndexedDB API文档中所看到的,close方法不会触发完成事件,但是数据库删除方法会。无论如何,您都不需要监听这些事件。

1
我遇到的问题是有时候 indexedDB.deleteDatabase 会触发 blocked 事件,很可能是因为数据库还没有被关闭。但在这种情况下,对于该数据库是否最终仍会被删除,目前仍不清楚。 - aknuds1
这是因为您在没有关闭所有连接的情况下打开了数据库。 - Kyaw Tun
我不认为有这种情况。首先,在我尝试打开数据库之前就发生了这种情况,而且此时我已经调用了数据库的close方法。其次,我相当确定这是因为在我调用deleteDatabase之前,close方法还没有完成(文档确实说如果数据库还没有关闭,deleteDatabase会触发blocked)。 - aknuds1
1
关闭前删除是可以的。关闭不要被阻塞删除。确保你的测试不会并行运行。 - Kyaw Tun
我遇到了打开和关闭连接的类似问题。删除数据库以便在完成时获得回调不是我的选择,所以我有点为难。 - buley
我遇到了删除数据库被阻止的问题。没有对该数据库进行任何操作。因此,在删除之前关闭数据库是有效的!在 Safari、FF 和 Chrome 的移动版本中进行了测试。 - Jonny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接