Indexddb 两次 open 被挂起

发布于 2022-09-11 15:29:37 字数 950 浏览 21 评论 0

问题描述

我需要在项目中动态的增加 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 事件。事实上,successerror 也没有被触发。请问这种情况要怎么解决?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

迷乱花海 2022-09-18 15:29:37

忘记结束问题了,当时就解决了,使用 close() 方法结束数据库连接,写在了问题的评论里。
最近已经在系统的研究 indexedDB 了,目前在 MDN 上翻译了不少 IndexedDB 的文档了。
关于上述问题的详情和原理,可参见 MDN 文档。

简单来说,当同一个源下的同一个数据库被打开时,进行版本升级是会被阻断的,直到调用了 close 方法关闭了之前的数据库连接,升级事件才会继续执行。

丑丑阿 2022-09-18 15:29:37

目测indexedDB 打开后开启了一次事务,你不能在upgradeneeded 里边再次调用open 这样是两个事务肯定冲突

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文