【问题标题】:`AbortError` within IndexedDB `upgradeneeded` eventIndexedDB `upgradeneeded` 事件中的`AbortError`
【发布时间】:2016-03-25 18:32:00
【问题描述】:

在以下代码中,Firefox 将AbortError 添加到控制台,而 Chrome 没有。

var bugDB = 'test1';
var delReq = indexedDB.deleteDatabase(bugDB);
delReq.onsuccess = function () {
    var req = indexedDB.open(bugDB);
    req.onupgradeneeded = function (e) {
        console.log('upgrade');
        req.result.close();
        console.log('finish closing');
    };
};

虽然此错误不会阻止“完成关闭”的执行,但它确实会在 Firefox 的 Mocha/Chai 测试中引起问题(尽管如果在 req.onsuccess 处理程序中调用 req.results.close() 则不会发生此类错误。这是Firefox 中的错误?如果AbortError 正在某处传播(设计使然?),如何成功捕获它(e.target.result.onabort 不起作用)?

【问题讨论】:

    标签: google-chrome firefox indexeddb


    【解决方案1】:

    此行为符合规范:

    https://w3c.github.io/IndexedDB/#opening

    “打开数据库的步骤” 8.2:如果连接在升级之后但在成功之前关闭 - 这将在调用 close() 时发生,因为在升级事务完成之前关闭实际上不会发生 - 然后打开请求失败如您所见,使用AbortError

    在 Chrome 和 Firefox 中的行为是相同的;默认情况下,Chrome 只是不记录错误。如果添加:

    req.onerror = function(e) {
      console.log(req.error.name, req.error.message); 
    };
    

    ...您也会在 Chrome 中看到它。

    【讨论】:

    • 日志记录之间的差异对我来说是个问题,谢谢...所以我可以用preventDefault 防止随后的中止。顺便说一句,说到preventDefault,我认为3.1.11,在第二个示例4下,在调用createObjectStore之前有transaction.onerror,而我认为它应该是request.onerror
    • 从我的测试(至少在 Promises 中工作时)看来,某些 IndexedDB 错误可以通过 try-catch 捕获(并安全地提供给 Promise reject),而其他错误只能被捕获在onerror 中使用preventDefault(否则,将永远无法达到Promise reject(或resolve))。如果是这种情况,有没有办法区分哪些类型的动作会看到这两种错误类型中的哪一种?
    • transaction.onerror 很好。错误事件从请求到事务再到数据库冒泡。如所写,该示例使来自 add() 的任何 ConstraintError 都不会中止事务。
    • 在调用点可检测到的同步错误(即您提供了无效的键、不可克隆的值、事务已经完成、事务处于非活动状态、存储或索引已删除、光标已经在推进,等等)抛出。实际操作的失败(即约束错误、中止后处理的请求等)触发事件。每个方法的规范中都详细列出了同步失败(以及抛出的内容)。
    • 谢谢!我忘记了可以通过e.target.transactionreq.transaction 获得transaction。您对同步错误与事件触发的高级解释帮助我更好地构建了它,因为我没有从阅读规范中掌握它。我将抛出和错误事件触发混为一谈。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多