0

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

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

2-请求打开数据库。

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

4- 在第一个事务上调用 oncomplete 事件以创建第二个事务。

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

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

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

4

2 回答 2

2

您可以在一次交易中完成所有事情。如果您打开您的事务,则定义此事务的范围。范围可以存在于多个对象存储之外。通过提供您要定位的对象存储的所有名称的数组。

var transaction = db.transaction(["obj1", "obj2"]);
于 2012-09-28T11:17:56.320 回答
1

根据我的经验,在等待 AJAX 响应时事务往往会关闭,因此您必须在 AJAX 响应的成功处理程序中打开事务。

让多个重叠事务并行“运行”肯定没有错,但实际上 JavaScript 仍然是单线程的——你会发现即使是 AJAX 成功处理程序也是按顺序运行的,并且排序是相当可预测的(尽管不能保证),因此,如果您在每个交易中打开一个事务,然后使用一系列 put 处理数据,您可能实际看到的是:

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

理论上,真正使事情并行发生的唯一方法是使用工作线程,但即便如此,大多数实现仍会将工作集中到单个线程。实际上,后端在优化“批量”写入方面非常出色,因此您甚至不会从使用工作人员中获得太多性能改进。

于 2012-10-01T18:47:10.617 回答