[试图捕获与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中,不需要关闭数据库。目的是重新初始化映射变量,就像加载页面时一样,无需重新加载页面,并且由onsuccess
的IDBFactory.open()
事件触发。尝试打开一个已经打开的数据库似乎仍然会触发onsuccess
事件,而不是错误或无提示地忽略该请求。由于我没有更改版本,因此如果这是正常的响应,则无需关闭。似乎在打开之前也可以使用close,因为在过去的几天中,它在测试中并没有出错。但是,在这种情况下,我们知道没有等待等待的公开交易。
澄清几点: