我的代码如下:
...
var f1 = function(trans) {
var store = trans.objectStore('ObjectStore');
store.clear();
};
var f2 = function(trans) {
var store = trans.objectStore('ObjectStore');
store.add({id: 1, data: 'text'});
};
...
var trans = DB.connection.transaction(['ObjectStore'], IDBTransaction.READ_WRITE);
trans.onerror = function() { alert('ERROR'); };
trans.oncomplete = function() { alert('DONE'); };
...
我们的问题是我在之后立即收到“完成”警报clear
并且在第二个请求时出现异常。
是否可以“重用”IndexedDB 中的事务?
UPD:我发现上面的代码在最新的 Chromium nightly build 中可以按照我的预期工作。
根据乔纳斯·西金的说法 http://blog.nparashuram.com/2011/11/indexeddb-apis-javascriptnext.html是 IndexedDB 的 Mozilla 开发者和联合规范编写者,当最后一个回调触发时,就会提交事务。因此,为了保持事务处于活动状态,您应该能够通过连续的回调重用它。
你正在使用oncomplete
上面,但是onsucess
也应该同样有效。
您可以找到事务对象作为回调返回的请求对象的属性。
以下句子不正确“今日交易自动提交
当事务变量超出范围并且不再有请求时
可以针对它放置”。
当变量超出时事务永远不会自动提交
范围。一般来说,他们只在最后一次成功/错误回调时提交
触发并且该回调不会安排更多请求。所以这不是
与任何变量的范围有关。
唯一的例外是,如果您创建了交易但没有放置
反对它的请求。在这种情况下,交易被“提交”
(无论这对于没有请求的交易意味着什么)尽快
当您返回事件循环时。在这种情况下你可以
一旦所有提及交易,技术上就“提交”交易
超出了范围,但这并不是一个特别有趣的用例
优化。
基于一个规格示例 http://www.w3.org/TR/IndexedDB/#idl-def-IDBRequest下面,您应该能够在以下位置找到交易对象:evt.transaction
,您可以进行新的交易并添加新的onsuccess
事件监听器。
var request = indexedDB.open('AddressBook', 'Address Book');
request.onsuccess = function(evt) {...};
request.onerror = function(evt) {...};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)