插入大量数据使页面空闲

时间:2015-12-03 09:15:42

标签: indexeddb

我在浏览器上使用索引数据库,在服务器端使用其他数据库。我在服务器数据库上有大量数据。

当我从服务器请求数据时,Index db在插入整个数据时会被锁定。因此,我的前端变得空闲,我无法执行任何操作。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

在交易过程中将收益控制权交还给浏览器。

例如,如果你有这个:

var records = [ ... ]; // say there 100k records
for (var i = 0; i < records.length; ++i)
  store.put(records[i]);

......将提出100k请求;即使发起每个请求的开销很小(几微秒),它也会累积到一个无响应的页面。

另一个极端是一次插入一条记录,在每次请求后将控制权交还给浏览器:

var i = 0;
function doNextRecord() {
  if (i < records.length) {
    store.put(records[i]).onsuccess = doNextRecord;
    ++i;
  }
}
doNextRecord();

这将使页面保持响应,但屈服于事件循环100k次意味着事务将花费很长时间。

相反,请考虑使用批次。

var i = 0, BATCH_SIZE = 1000;
function doNextBatch() {
  var request;
  for (var b = 0; i < records.length && b < BATCH_SIZE; ++i, ++b)
    request = store.put(records[i]);
  if (i < records.length)
    request.onsuccess = doNextBatch;
}
doNextBatch();

更好的是,设置一个帧限制(例如4ms),而不是固定大小,记录你花了多少时间,然后屈服。