我的代码如下:
...
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
之后立即收到DONE警报,并出现第二个请求异常。
是否可以在IndexedDB中“重用”该事务?
UPD:我发现上面的代码在最新的Chromium每晚版本中都能正常运行。
答案 0 :(得分:4)
According to Jonas Sicking,一个用于IndexedDB的Mozilla开发和共同编写器,当最后一个回调触发时,事务被提交。因此,为了保持事务处于活动状态,您应该能够通过连续的回调重用它。
您上面使用的是oncomplete
,但onsucess
也应该同样有效。
您可以将事务对象视为在回调时返回的请求对象的属性。
以下句子不正确“今日交易自动提交 当事务变量超出范围而没有更多请求时 可以反对它。“
当变量消失时,事务永远不会自动提交 范围。通常它们只在最后一次成功/错误回调时提交 触发并且回调计划不再需要。所以事实并非如此 与任何变量的范围有关。
唯一的例外是如果您创建了一个事务但是没有 要求反对它。在这种情况下,交易是“已提交” (对于没有请求的交易,这意味着什么) 当你返回事件循环。在这种情况下你可以 技术上,只要所有引用它都会“提交”事务 超出范围,但它不是一个特别有趣的用例 优化
根据下面的spec example,您应该能够在evt.transaction
找到事务对象,并且可以执行新事务并添加新的onsuccess
事件侦听器。
var request = indexedDB.open('AddressBook', 'Address Book');
request.onsuccess = function(evt) {...};
request.onerror = function(evt) {...};