对于我的IndexedDB,我正在提取各种Ajax请求,这些请求将向objectStores提供数据。 由于事务是异步的,我应该如何链接objectStores的创建? 我在考虑这样做:
1-在脚本开头拉取所有Ajax请求。
2-请求打开数据库。
3-在onsuccess处理程序中打开第一个事务以创建第一个objectStore并插入相应的数据。
4-在第一笔交易中调用oncomplete事件以创建第二笔交易。
5-对需要创建的所有objectStore执行此操作。
这是最好的方法,还是我应该只编写indexedDB.open请求的onsuccess处理程序中的所有事务?
我可以创建各种objectStore并同时插入大量数据而不会导致错误吗?
答案 0 :(得分:2)
您可以在一次交易中完成所有事情。如果您打开交易,则定义此交易的范围。范围可以存在于多个对象库中。通过提供要定位的对象库的所有名称的数组。
var transaction = db.transaction(["obj1", "obj2"]);
答案 1 :(得分:1)
根据我的经验,在等待AJAX响应时,事务往往会关闭,因此您必须在AJAX响应的成功处理程序中打开事务。
将多个重叠事务“并行运行”并没有什么不妥,但实际上JavaScript仍然是单线程的 - 你会发现即使是AJAX成功处理程序也是顺序运行的,并且排序是可以预测的(尽管不是保证),所以如果你在每个交易中打开一个交易,然后用一系列看跌期权处理数据,你可能实际看到的是:
openAjax1()
openAjax2()
ajax1Complete()
// in here, open transaction1 and call objectStore1.put() many times
ajax2Complete()
// in here, open transaction2 and call objectStore2.put() many times
put() // from ajax1
put() // from ajax1
put() // from ajax1
... // from ajax1
// transaction1 completes
put() // from ajax2
put() // from ajax2
put() // from ajax2
... // from ajax2
// transaction2 completes
理论上,实际并行发生事情的唯一方法是使用工作线程,但即使这样,大多数实现也会将工作集中到单个线程。实际上,后端非常适合一起优化“批量”写入,因此使用工作者甚至不会获得很大的性能提升。