如何在IndexedDB中的一个事务中放入多个请求

时间:2012-05-07 15:40:37

标签: indexeddb

我的代码如下:

...
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每晚版本中都能正常运行。

1 个答案:

答案 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) {...};