Indexddb 两次 open 被挂起
问题描述
我需要在项目中动态的增加 indexddb
的“表”(store),而不是一次初始化就能确定好所有要用的表。但在触发版本更新事件时遇到了问题,问题的症结如下:
代码如下
const one = window.indexedDB.open('test');
one.onupgradeneeded = e => {
console.log('db one upgrade success', e.target.readyState);
updateDB();
}
function updateDB() {
const tow = window.indexedDB.open('test', 2);
tow.onupgradeneeded = e => {
console.log('db tow upgrade success', e.target.readyState);
}
tow.onblocked = e => {
console.log('blocked:', e)
}
setTimeout(() => {
console.log(tow.readyState);
}, 3000);
}
运行结果
疑问
在创建数据库后,对数据库进行版本的更新,并期望在 upgradeneeded
事件中进行一些操作,但第二次的操作一直被挂起,无法触发 upgradeneeded
事件。事实上,success
和 error
也没有被触发。请问这种情况要怎么解决?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
忘记结束问题了,当时就解决了,使用 close() 方法结束数据库连接,写在了问题的评论里。
最近已经在系统的研究 indexedDB 了,目前在 MDN 上翻译了不少 IndexedDB 的文档了。
关于上述问题的详情和原理,可参见 MDN 文档。
简单来说,当同一个源下的同一个数据库被打开时,进行版本升级是会被阻断的,直到调用了
close
方法关闭了之前的数据库连接,升级事件才会继续执行。目测indexedDB 打开后开启了一次事务,你不能在upgradeneeded 里边再次调用open 这样是两个事务肯定冲突