当 IndexedDB 事务完成或成功时,我使用两个不同的事件来响应回调:
比方说... db:IDBDatabase 对象,tr:IDBTransaction 对象,os:IDBObjectStore 对象
tr = db.transaction(os_name,'readwrite');
os = tr.objectStore();
case 1 :
r = os.openCursor();
r.onsuccess = function() {
if(r.result){
callback_for_result_fetched();
r.result.continue;
} else {
callback_for_transaction_finish();
}
}
case 2:
tr.oncomplete = callback_for_transaction_finish();
如果两者的工作方式相似,那就太浪费了。那么你能告诉我,它们之间有什么区别吗?
很抱歉提出了一个很旧的话题,但它的质疑是一个很好的起点......
我寻找过类似的问题,但在有点不同的用例中,实际上没有找到好的答案,甚至没有找到误导性的答案。
当您需要时考虑一个用例多次写入甚至分成几个对象存储。你绝对不想要管理每个写入及其自身的成功和错误事件。这就是事务的含义,这是它在 indexedDB 中的(正确)实现:
var trx = dbInstance.transaction([storeIdA, storeIdB], 'readwrite'),
storeA = trx.objectStore(storeIdA),
storeB = trx.objectStore(storeIdB);
trx.oncomplete = function(event) {
// this code will run only when ALL of the following requests are succeed
// and only AFTER ALL of them were processed
};
trx.onerror = function(error) {
// this code will run if ANY of the following requests will fail
// and only AFTER ALL of them were processed
};
storeA.put({ key:keyA, value:valueA });
storeA.put({ key:keyB, value:valueB });
storeB.put({ key:keyA, value:valueA });
storeB.put({ key:keyB, value:valueB });
这种理解的线索可以在 W3C 的以下声明中找到spec http://www.w3.org/TR/IndexedDB/#widl-IDBTransaction-oncomplete:
要确定事务是否已成功完成,请监听事务的完成事件而不是特定请求的成功事件,因为成功事件触发后事务仍可能失败。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)