indexedDB setVersion请求被阻止了吗?

时间:2011-12-07 15:04:30

标签: javascript coffeescript indexeddb

我正在尝试将indexedDB与jax webGL framework一起使用,但由于某种原因,setVersion无效。

这是相关的coffeescript

if @indexedDB and @objectStore and @key
  idb_request = indexedDB.open @indexedDB
  idb_request.onsuccess = (e) =>
    idb = e.target.result

    if idb.objectStoreNames.contains @objectStore
      store = idb.transaction([@objectStore], IDBTransaction.READ_WRITE).objectStore(@objectStore)

    else

      console.log idb.version # => ""

      version_request = idb.setVersion(0.1)
      version_request.onblocked = (e) -> console.log e #=> this one fires
      version_request.onerror = (e) -> console.log e
      version_request.onsuccess = (e) -> console.log e
      version_request.onfailure = (e) -> console.log e

  idb_request.onerror = (e) -> console.log "ERROR: Unable to open indexedDB"

...

附加到触发的版本请求的唯一处理程序是onblocked,但我甚至不确定对于阻止请求意味着什么,或者为什么会发生这种情况......

为什么会阻止版本请求?

2 个答案:

答案 0 :(得分:1)

根据IndexedDB规范,如果在发出版本更改请求时数据库连接仍处于打开状态,则可能会发送blocked事件。请参阅:http://www.w3.org/TR/IndexedDB/#version_change-transaction-steps

以下是规范中的文字:

3. If running asynchronously and any of the connections in openDatabases are still not closed, queue up a blocked event for the request.

FWIW:我无法在Jax中重现这个问题;我知道最好不要说这是不可能的,但此时看起来不太可能是框架中的错误。相应的Jax问题是:https://github.com/sinisterchipmunk/jax/issues/37

答案 1 :(得分:1)

以下是使用IndexedDB进行开发时保持数据库连接打开的两种常用方法:

1)打开多个标签页。

2)意外打开数据库两次。