Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 阻止IndexedDB请求错误取消事务_Javascript_Html_Transactions_Indexeddb - Fatal编程技术网

Javascript 阻止IndexedDB请求错误取消事务

Javascript 阻止IndexedDB请求错误取消事务,javascript,html,transactions,indexeddb,Javascript,Html,Transactions,Indexeddb,我的意图 循环本地存储并将数据放入IndexedDB。 如果发生了某些已知错误,例如密钥已存在时发生的错误,我希望忽略这些特定错误,以便不会中止事务。当请求触发错误时,中止事务是默认行为 问题 我认为在请求onerror处理程序中使用event.preventDefault()。令人惊讶的是,事件仍然出现在事务的错误处理程序中!我可以通过打开日志记录看到这种情况(请参阅下面的代码) 当事务内部出现问题时,事务出错是合乎逻辑的。这就是事务存在的方式,以保持数据库的一致性 在您的情况下,最好首先检查

我的意图

循环本地存储并将数据放入IndexedDB。 如果发生了某些已知错误,例如密钥已存在时发生的错误,我希望忽略这些特定错误,以便不会中止事务。当请求触发错误时,中止事务是默认行为

问题

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


当事务内部出现问题时,事务出错是合乎逻辑的。这就是事务存在的方式,以保持数据库的一致性

在您的情况下,最好首先检查密钥是否存在。如果有,则不执行任何操作。在另一种情况下,您可以插入数据


另一种解决方案是为每个要保存的对象打开一个事务…

我粘贴的代码的日志输出似乎诱使我认为事务已中止,因为调用了transaction.onerror处理程序。不过,我没有记录的是transaction.onabort是否被调用。。。事实证明,打个电话就足够了

让我困惑的是,错误传播到了事务错误处理程序。不过,该事务没有中止!。它只是在阻止默认操作(中止)后引发事件。为了消除消息,我还需要调用,以防止事件冒泡到事务的错误处理程序。请注意,如果您只需要不取消交易,则严格来说这不是必需的


我在W3C文档和IBMTransaction中找到了答案

这太简单了。对于WebSQL,可以从单个语句的错误处理程序返回一个布尔值,指示是否应忽略错误。如果该值已经存在,我会这样做-忽略该错误,因为从另一个后端迁移数据时,该错误可能较新。在W3C文档中找到了答案。正如我所希望的那样,有一种有效的方法来处理这个问题:)我对这个问题感兴趣,但还没有跟上。你能用重述你发现的事实(也许是要点)来更新你的问题@oligofren吗?如果你发现了事件的疯狂性,我不会感到完全惊讶。@buley我已经改写了问题和答案,使其更加简洁和中肯。希望有帮助。
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(); }
        };
    }
}