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

问题描述 投票:1回答:1

[试图捕获与indexedDB数据库请求有关的错误并提供挽救数据库的选项,我想提供关闭数据库,重新打开数据库以及重置RAM中保存的映射数据值的选项。因为页面是由扩展程序作用的,所以我不希望用户刷新浏览器,而是使用自定义错误对话框中提供的按钮。

看起来很简单,但我必须错过一些重要的东西。 close方法不返回promise,但MDN documents状态将立即返回并在单独的线程中关闭数据库。我尝试在使用db.addEventListener( 'close', handler, false )之前定义一个简单的事件侦听器here(如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上注意到this信息,该信息指出使用close方法时close事件不会触发,但是只有在意外情况下才会出现,@ Josh在出现的答案中指出了这一点后来被删除了。因此,以上操作将无效。

[也许,因为在这种情况下,可以确定所有事务都已关闭,并且在新的close之前请求open,所以关闭总是会首先完成。到目前为止,在这种情况下,db.close()紧随其后的是数据库打开调用。


经过进一步处理之后,看来对于我简单的重启或重置情况,至少在Firefox中,不需要关闭数据库。目的是重新初始化映射变量,就像加载页面时一样,无需重新加载页面,并且由onsuccessIDBFactory.open()事件触发。尝试打开一个已经打开的数据库似乎仍然会触发onsuccess事件,而不是错误或无提示地忽略该请求。由于我没有更改版本,因此如果这是正常的响应,则无需关闭。似乎在打开之前也可以使用close,因为在过去的几天中,它在测试中并没有出错。但是,在这种情况下,我们知道没有等待等待的公开交易。

javascript indexeddb
1个回答
0
投票

澄清几点:

© www.soinside.com 2019 - 2024. All rights reserved.