我的代码如下所示:
...
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 中按我的预期工作。
根据 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)