[英]How to close and re-open indexedDB database without reloading the page?
在尝试捕获与 indexedDB 数据库请求相关的错误并提供挽救数据库的选项时,我想提供关闭数据库、重新打开数据库和重置 RAM 中保存的映射数据值的选项。 因为页面是由扩展程序操作的,所以我不希望用户刷新浏览器,而是使用自定义错误对话框中提供的按钮。
这看起来很简单,但我一定遗漏了一些重要的东西。 close
方法不返回承诺,但MDN 文档声明它立即返回并在单独的线程中关闭数据库。 我试图定义监听一个简单的事件db.addEventListener( 'close', handler, false )
描述这里使用前) db.close()
但它永远不会被调用。 数据库似乎关闭了,因为单击该按钮后,其余的数据库操作不再起作用。 我想在数据库关闭后重新打开它,因为这将触发一组初始化步骤并尝试重新开始而不重新加载页面。
我的问题是如何在尝试再次打开数据库之前侦听数据库close
事件,以及如何知道close
方法是否失败?
谢谢你。
function DB_restart()
{
DB.addEventListener( 'close', expected, false );
DB.close();
function expected( evt )
{
console.log( 'closed' );
console.log( evt );
// ... DB_open() ...
}
} // close DB_restart
我之前没有在 MDN 上注意到此信息, 该信息指出在使用close
方法时不会触发close
事件,但只有在意外时才会触发,@Josh 在似乎随后已删除的答案中指出了这一点。 所以,上面的方法是行不通的。
也许,因为在这种情况下,对某些已知所有交易已关闭, close
请求新的前open
,收盘始终将完整的第一。 db.close()
紧随其后的数据库打开调用到目前为止一直在这种情况下工作。
在进一步研究之后,对于我重新启动或重置的简单情况,至少在 Firefox 中,关闭数据库似乎是不必要的。 目标是重新初始化映射变量,就像页面加载时不重新加载页面一样,这是由IDBFactory.open()
的onsuccess
事件触发的。 尝试打开一个已经打开的数据库似乎仍然会触发onsuccess
事件而不是错误或默默地忽略请求。 由于我没有换版本,如果这是正常响应,则无需关闭。 似乎在 open 之前立即使用 close 也有效,因为在过去几天它在测试中没有出错; 但是,在这种情况下,我们知道没有要等待的未处理事务。
澄清几点:
"close"
事件仅在异常关闭时触发 - 例如磁盘断开连接,检测到不可恢复的损坏等。从脚本调用close()
不会触发它。
当调用close()
然后open()
(没有版本碰撞)时,如果有事务正在运行,新连接可能会在前一个连接关闭之前打开。 您可以通过启动一个带有循环的事务来观察这一点,该循环在前一个请求成功时发出新的 get() 请求(直到布尔变量设置为 true),保持运行,然后打开一个新连接,然后停止打开成功后的循环(通过将布尔值设置为 true)。
总的来说,目前还不清楚你在问什么。 如果您确定数据库中的数据本身是错误的,您可能想要 close() 并发出deleteDatabase()
调用,并确保您的所有连接都执行close()
以响应"versionchange"
事件,以便删除没有被阻止。 删除成功后,您可以重建/重新填充数据库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.