我正在尝试将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,但我甚至不确定对于阻止请求意味着什么,或者为什么会发生这种情况......
为什么会阻止版本请求?
答案 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)意外打开数据库两次。