防止IndexedDB请求错误取消事务

e5njpo68  于 2022-12-20  发布在  IndexedDB
关注(0)|答案(2)|浏览(192)

"我的意图"
遍历localStorage并将数据放入IndexedDB。如果发生某些已知错误,例如键已存在时的ConstraintError,我希望忽略这些特定错误,以便事务不会中止。当请求触发错误时,中止事务是默认行为。

    • 问题是**

我以为在请求的onerror处理程序中使用event.preventDefault()可以防止这种情况发生,但令人惊讶的是,该事件仍然出现在事务的错误处理程序中!我可以通过打开日志记录(参见下面的代码)看到这种情况。

transaction.onerror = function (event) {
    log('IndexedDb.migrateLocalStorage -> transaction -> onerror', event.target.error.name);
};
transaction.oncomplete = function () {
    log('IndexedDb.migrateLocalStorage -> transaction -> oncomplete');
};

for (var key in $W.localStorage) {

    if ($W.localStorage.hasOwnProperty(key)) {
        value = $W.localStorage.getItem(key);
        request = objectStore.add(addQuotesIfNecessary(value), key);
        request.onerror = function (event) {
            var error = event.target.error;
            log('IndexedDb.migrateLocalStorage -> request -> onerror', error, error.name);

            // do nothing if the same key exists in indexeddb. it is likely newer
            if (error.name === 'ConstraintError') { event.preventDefault(); }
        };
    }
}
deikduxw

deikduxw1#

看起来我粘贴的代码的日志输出欺骗了我,让我以为事务被中止了,因为transaction.onerror处理程序被调用了。但是,我没有记录是否调用了transaction.onabort.,..,.事实证明,调用event.preventDefaultactually 就足够了!
让我感到困惑的是,错误会传播到事务错误处理程序。* 事务没有被中止,虽然!*。它只是在阻止默认操作后使事件冒泡为了删除消息,我还需要调用event.stopPropagation,以防止事件冒泡到事务的错误处理程序。请注意,如果您只是需要交易不被取消,则这不是绝对必要的。
我在IDBRequst和IBTransaction的W3C文档中找到了答案。

piok6c0g

piok6c0g2#

当事务内部出错时,事务出错是合乎逻辑的,这就是事务存在的方式,以保持数据库一致。
在您的情况下,您最好先检查键是否存在。如果存在,则在其他情况下不做任何操作,您可以插入数据。
另一种解决方案是为要保存的每个对象打开一个事务......

相关问题