在寻找向indexedDB添加许多项目时,我正在寻找最佳实践。项目数量的上限通常约为100k,每个项目都是一个js对象,通常约为350字节。
我维护了一个待处理项目(操作)列表,这些项目要在数据库上进行(每个操作都是"添加"," put"或者"删除&#34 ;),每个项目可以属于不同的对象存储区。
我只需要取第一个项目,将其应用到相应的objectStore,一旦完成(成功或不成功),我将继续下一个项目。
有更好(更有效)的方法吗?是否有任何范围问题w.r.t.交易生命周期我需要关注下面的片段吗?
function flushPendingDbActions() {
var transaction = db.transaction(storeNames, "readwrite");
var addNext = function() {
var nextItem = pendingDbActions[0];
if (nextItem) {
pendingDbActions.shift();
var objectStore = transaction.objectStore(nextItem.store),
params,
request;
switch(nextItem.action) {
case 'add':
case 'put':
params = nextItem;
break;
case 'delete':
params = nextItem.key;
break;
}
request = objectStore[nextItem.action](params);
request.onsuccess = request.onerror = addNext;
}
};
addNext();
}
答案 0 :(得分:1)
对我来说没问题,但有几件事情:
修改 - 添加内容:
根据https://www.w3.org/TR/IndexedDB-2/#transaction-lifetime-concept:
除非另有规定,否则请求必须按照对交易的顺序执行。同样,他们的结果必须按照针对特定交易的请求的顺序返回。
因此,您应该能够同时启动请求而不是串行启动请求,这应该避免TransactionInactiveError。即使您发出相当于add item > delete item
的请求,也是如此。
然后由于请求位于堆栈中而遇到堆栈溢出问题,因为请求位于堆栈中,然后在这种情况下应考虑缓冲。因此,请使用pendingactions数组并以块的形式处理它。让我们说1000一次,将1000传递给一个processchunk帮助函数,它会触发1000个并发请求,等待它完成,然后处理下一个块,直到所有块都被处理完毕。