根据IndexedDB规范,为什么在indexedDB.deleteDatabase调用上关闭打开的数据库连接?

时间:2015-07-09 03:46:13

标签: javascript indexeddb

Let's look at what the IndexedDB spec says about deleting a database.具体来说,我担心如果您尝试删除仍有一个或多个打开连接的数据库会发生什么,例如:

indexedDB.open('test', 1);
indexedDB.deleteDatabase('test');

以下是规范的说法:

  
      
  1. 在打开的openDatabases中的每个对象上触发versionchange事件。绝不能在设置了closePending标志的对象上触发事件。该事件必须使用IDBVersionChangeEvent接口,并将oldVersion属性设置为db的版本,并将newVersion属性设置为null。此事件不得冒泡或可取消。
  2.   
  3. 如果openDatabases中的任何连接仍未关闭,并且提供了请求,请在请求时触发阻止的事件。该事件必须使用IDBVersionChangeEvent接口,并将oldVersion属性设置为db的版本,并将newVersion属性设置为null。此事件不得冒泡或可取消。
  4.   
  5. 等到openDatabases中的所有对象都关闭并且所有事务都已完成。
  6.   

我不明白第7步是如何完成的。步骤5或6中实际关闭其中一个打开连接的是什么?除了让onversionchangeonblocked处理程序响应之外,这些步骤甚至做了什么?

类似的语言出现在steps for running a "versionchange" transaction中,因为当您尝试打开版本的数据库打开连接时,就像这样:

indexedDB.open('test', 1);
indexedDB.open('test', 2);

FWIW,我问这个世俗问题的原因是因为this

2 个答案:

答案 0 :(得分:3)

  

我不明白第7步是如何完成的。步骤5或6中实际关闭其中一个打开连接的是什么?除了让onversionchange和onblocked处理程序响应外,这些步骤甚至做了什么?

这就是所有这些步骤。 UA会触发这些事件,并允许脚本在需要时关闭现有连接。如果脚本选择不关闭现有连接,则步骤7不会完成。

规范中没有对此进行描述,因为规范告诉UA要做什么,而不是脚本。虽然它应该在非规范性的介绍中描述。

答案 1 :(得分:2)

我的理解是所有连接都必须监听versionchange事件并关闭连接。否则,较新的应用程序既不会碰撞新版本也不会删除数据库。一个较新的应用程序最终将获得block事件。请注意deleteDatabase方法返回一个请求,但close方法不返回。