oli*_*ren 3 javascript html5 transactions indexeddb
我的意图
循环遍历localStorage并将数据放入IndexedDB.如果发生某些已知错误,例如当密钥已存在时出现ConstraintError,我想忽略这些特定错误,以便不中止事务.当请求触发错误时,中止事务是默认行为.
问题
我认为event.preventDefault()在请求onerror处理程序中使用会阻止这种情况发生.令人惊讶的是,事件仍然出现在事务的错误处理程序中!我可以通过打开日志记录来看到这种情况(请参阅下面的代码).
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(); }
};
}
}
Run Code Online (Sandbox Code Playgroud)
看来我粘贴的代码的日志记录输出让我误以为事务已中止,因为调用了transaction.onerror处理程序.然而,我没有记录的是是否调用了transaction.onabort ......事实证明,调用event.preventDefault 实际上已经足够了!
使我困惑的是错误传播到事务错误处理程序.但交易没有中止!.它只是在阻止默认操作(中止)之后冒泡了事件.为了消除消息,我还需要调用event.stopPropagation以防止事件冒泡到事务的错误处理程序.请注意,如果您只需要取消该交易,则不一定非必要.
我在IDBRequst和IBTransaction 的W3C文档中挖掘了答案.
| 归档时间: |
|
| 查看次数: |
1152 次 |
| 最近记录: |