在同一个脚本中创建各种IndexedDB objectStore的最佳方法是什么?

时间:2012-09-28 10:27:51

标签: javascript html5 indexeddb

对于我的IndexedDB,我正在提取各种Ajax请求,这些请求将向objectStores提供数据。 由于事务是异步的,我应该如何链接objectStores的创建? 我在考虑这样做:

1-在脚本开头拉取所有Ajax请求。

2-请求打开数据库。

3-在onsuccess处理程序中打开第一个事务以创建第一个objectStore并插入相应的数据。

4-在第一笔交易中调用oncomplete事件以创建第二笔交易。

5-对需要创建的所有objectStore执行此操作。

这是最好的方法,还是我应该只编写indexedDB.open请求的onsuccess处理程序中的所有事务?

我可以创建各种objectStore并同时插入大量数据而不会导致错误吗?

2 个答案:

答案 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

理论上,实际并行发生事情的唯一方法是使用工作线程,但即使这样,大多数实现也会将工作集中到单个线程。实际上,后端非常适合一起优化“批量”写入,因此使用工作者甚至不会获得很大的性能提升。