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 事件。事实上,successerror 也没有被触发。请问这种情况要怎么解决?

阅读 4.5k
2 个回答

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题