当通过IndexedDB存储数据的应用程序在同一浏览器的2个选项卡中打开时,代码尝试通过执行var dbDeleteRequest = window.indexedDB.deleteDatabase(DB_NAME, {storage: "temporary"});
通过一个选项卡删除数据库,则onerror
和onsuccess
都不会获得调用。
我可以确定数据库处于阻塞状态,因为应用程序在另一个选项卡中打开,我可以通过监听onblocked
事件来验证它。
当我关闭其他标签时,onsuccess
事件将被触发,因此这表明数据库现在未处于阻止状态。
然而,即使在两个选项卡中打开应用程序,我也可以执行select,insert等操作,这意味着数据库实际上并未阻止所有内容,而只是用于版本更改操作。
我检查过,在WebSQL的情况下也不会发生这种情况。
有没有办法在IndexedDB中处理这种情况。
答案 0 :(得分:1)
请参阅文档,虽然不是很清楚,但它有关于此问题的示例代码:
答案 1 :(得分:0)
很抱歉,但很难解释你的问题是什么。你所描述的似乎正是indexedDB应该如何运作。如果数据库在多个选项卡中打开(指向同一个通用域),则数据库将触发某些事务的阻止事件,以保证数据的完整性。
通常,读取操作不能修改数据,因此读取操作是非阻塞的。写操作通常会修改数据,因此写操作通常会阻塞。在JS引擎的上下文中,对write的调用仍然是异步和非阻塞的,但不一定在数据库层中。
您所遇到的事情对我来说似乎是正常的预期行为,而不是问题。