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

Fed*_*dor 6 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'); };
...
Run Code Online (Sandbox Code Playgroud)

clear在第二个请求异常之后和之后立即收到 DONE 警报的问题出现了。

是否可以在 IndexedDB 中“重用”事务?

UPD:我发现上面的代码在最新的 Chromium nightly build 中按我的预期工作。

bul*_*ley 5

根据 Jonas Sicking(Mozilla 开发人员和 IndexedDB 联合规范编写者)的说法,当最后一个回调触发时,就会提交事务。因此,为了保持事务处于活动状态,您应该能够通过连续的回调重用它。

您正在使用oncomplete上面的内容,但onsucess也应该同样有效。

您可以找到事务对象作为回调返回的请求对象的属性。

以下句子不正确“当事务变量超出范围并且无法对其发出更多请求时,今天的事务会自动提交”。

当变量超出范围时,事务永远不会自动提交。通常,它们仅在最后一次成功/错误回调触发并且该回调不再安排请求时才提交。所以它与任何变量的范围无关。

唯一的例外是,如果您创建了一个事务但没有针对它发出任何请求。在这种情况下,一旦返回事件循环,事务就会“提交”(无论这对于没有请求的事务意味着什么)。在这种情况下,从技术上讲,一旦对事务的所有引用超出范围,您就可以“提交”事务,但这并不是一个特别有趣的优化用例。

根据下面的规范示例,您应该能够在 处找到事务对象evt.transaction,并且可以执行新事务并添加新的onsuccess事件侦听器。

 var request = indexedDB.open('AddressBook', 'Address Book');
 request.onsuccess = function(evt) {...};
 request.onerror = function(evt) {...};
Run Code Online (Sandbox Code Playgroud)