Управление доходом обратно в браузер во время транзакции.
Например, если у вас есть это:
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) и вместо фиксированного размера отслеживать, сколько времени вы потратили, и выход тогда.