繁体   English   中英

如何在不重新加载页面的情况下关闭并重新打开 indexedDB 数据库?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM