Indexeddb:onsuccess 和 oncomplete 之间的区别?

2024-03-08

当 IndexedDB 事务完成或成功时,我使用两个不同的事件来响应回调:

比方说... db:IDBDatabase 对象,tr:IDBTransaction 对象,os:IDBObjectStore 对象

tr = db.transaction(os_name,'readwrite');
os = tr.objectStore();

case 1 :

r = os.openCursor();
r.onsuccess = function() {
    if(r.result){
        callback_for_result_fetched();
        r.result.continue;
    } else {
        callback_for_transaction_finish();
    }
}

case 2:

tr.oncomplete = callback_for_transaction_finish();

如果两者的工作方式相似,那就太浪费了。那么你能告诉我,它们之间有什么区别吗?


很抱歉提出了一个很旧的话题,但它的质疑是一个很好的起点......

我寻找过类似的问题,但在有点不同的用例中,实际上没有找到好的答案,甚至没有找到误导性的答案。

当您需要时考虑一个用例多次写入甚至分成几个对象存储。你绝对不想要管理每个写入及其自身的成功和错误事件。这就是事务的含义,这是它在 indexedDB 中的(正确)实现:

var trx = dbInstance.transaction([storeIdA, storeIdB], 'readwrite'),
    storeA = trx.objectStore(storeIdA),
    storeB = trx.objectStore(storeIdB);

    trx.oncomplete = function(event) {
        // this code will run only when ALL of the following requests are succeed
        // and only AFTER ALL of them were processed
    };
    trx.onerror = function(error) {
        // this code will run if ANY of the following requests will fail
        // and only AFTER ALL of them were processed
    };

    storeA.put({ key:keyA, value:valueA });
    storeA.put({ key:keyB, value:valueB });
    storeB.put({ key:keyA, value:valueA });
    storeB.put({ key:keyB, value:valueB });

这种理解的线索可以在 W3C 的以下声明中找到spec http://www.w3.org/TR/IndexedDB/#widl-IDBTransaction-oncomplete:

要确定事务是否已成功完成,请监听事务的完成事件而不是特定请求的成功事件,因为成功事件触发后事务仍可能失败。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Indexeddb:onsuccess 和 oncomplete 之间的区别? 的相关文章

随机推荐

  • 在 Android 10 / Android Q 上使用捆绑的 ttf 字体时发生崩溃

    当我将 Android 应用程序的目标级别从 28 更新到 29 Android 10 后 应用程序在 Pixel 3 使用 Android 10 上崩溃 使用的版本 Android Gradle 插件 3 5 0 摇篮5 5 1 问题 这
  • 新的 HTML5 Canvas API 支持

    我发现了几篇关于 HTML5 Canvas API 中新功能的帖子 例如路径基元或命中区域 目前的规范 4 8 11 似乎具有以下功能 http www whatwg org specs web apps current work mult
  • 仅加载适用于 ipad 的 css 文件

    我正在尝试加载仅适用于 ipad 的 css 文件 我试过这个 它适用于 iPad 但如果我在桌面上将分辨率降低到 1024 x 768 并在 Firefox 中查看该网站 ipad 样式表也会加载 所以我尝试 但仍然是同样的问题 我如
  • Express JS 路由中使用 formData 获取 POST 为空

    我有一个表单 它使用 fetch 到 AJAX 并在 NodeJS 上有一个路由 当 AJAX POST 命中路由时 req body 显示一个空对象 这是代码 在 app js 中 app use bodyParser json app
  • Web 服务一次只允许我获取 1000 行,但总数超过 30000

    我正在使用 Netsuite 提供的一些 Web 服务https system netsuite com help helpcenter en US Output Help SuiteFlex WebServices STP searchM
  • AWS Lambda:任务超时

    我的学校项目要求我们编写在 AWS Lambda 中运行的 Java 代码 它应该获取特定 URL 的源代码 然后将其上传到 S3 存储桶 Java 代码应在 AWS Lambda 上运行 我获取了 Java 中 String 变量的源代码
  • ElementTree的iterparse() XML解析错误

    我需要解析一个编码为 ISO 8859 1 的 1 2GB XML 文件 在阅读了 NET 上的几篇文章后 似乎 Python 的 ElementTree 的 iterparse 比 SAX 解析更受青睐 我写了一段非常短的代码只是为了测试
  • Selenium chrome 浏览器中的 Feign 焦点

    我正在使用 Selenium 从网站上抓取数据 该网站需要窗口焦点才能显示我需要的某些元素 我希望能够在后台运行我的程序 而不必在运行时聚焦窗口 有没有什么办法可以让网站认为它的重点是 我正在使用硒铬驱动程序 Edit 这是我构建的一个快速
  • Android是否阉割了ARM的Jazelle技术?

    我认为 Android 中的 Java 字节码 混蛋 的理由是性能 我怀疑还有另一个原因 但是 通过更改字节码 他们难道没有让 Jazelle 等硬件加速技术变得毫无意义 从而实际上降低了 Mobile Java 平台的可用性能吗 目标平台
  • 通过蓝牙传输文件,如 Android 蓝牙聊天示例

    如何使用 Android 蓝牙聊天示例并将其更改为文件传输 我想通过蓝牙将本地 SQLite 数据库传输到另一台 Android 设备 我更改了示例代码 http developer android com resources sample
  • 在多个文件之间共享枚举的正确方法是什么?

    我想在当前 C 项目的客户端和服务器部分使用相同的枚举 但不确定执行此操作的正确方法 我可以轻松地将枚举写入它自己的文件中 并将其包含在两个文件中 但这感觉像是不好的做法 将其放入命名空间然后将其包含在两者中是正确的方法吗 我知道这有点主观
  • 如何在 Django 模板上下文中获取“调试”变量?

    根据这个SO帖子 如何检查 django 模板中的 TEMPLATE DEBUG 标志 https stackoverflow com questions 1271631 how to check the template debug fl
  • 将 aSmack 0.8.3 用于 XMPP 聊天应用程序时出现 NoSuchAlgorithmException

    我已经包含了 logcat 输出 请帮我解决这个问题 08 09 11 06 32 762 警告 NetworkManagementSocketTagger 883 setKernelCountSet 10012 0 失败 错误号 2 08
  • 检测多个if语句中哪个条件为假

    我尝试缩短我的代码 因此我来缩短以下类型的 if 语句 a b c d needed to run if empty a echo a is empty elseif empty b echo b is empty elseif empty
  • 在 Prolog 中解答爱因斯坦之谜

    我正在尝试解决爱因斯坦之谜 https www wikiwand com en Zebra Puzzle在序言中 我在编写程序时遇到了困难 基本方法是添加所有约束并让 Prolog 找出唯一可能的解决方案 问题是 Prolog 找到了 0
  • html5视频预加载

    是否可以预加载 html 视频 注意 该标签是稍后动态创建的 目前 我可以通过创建一个隐藏的 div 并将所有图像放入其中来对图像执行此操作 然后当我稍后创建需求时 图像不需要重新加载 当使用视频标签完成此操作时 浏览器仍会在创建元素时从头
  • 从类库 .NET Core 3 中的非控制器类访问 ILogger

    我们正在将 NET Framework 应用程序 MVC 迁移到 NET Core 3 应用程序 MVC 我们有一个场景如下 流程1 由Controller实例化的类 流程 2 ClassX 由 ClassY 实例化 由 Class 实例化
  • Matlab - 缩放图像的颜色条

    我怎样才能扩展colorbar假彩色图像的轴 我读了这篇文章 并复制了代码 但似乎无法正常工作 MATLAB Colorbar 相同的颜色 缩放值 https stackoverflow com questions 45285114 mat
  • 使用 Google Cloud Storage python 客户端进行批量请求

    我找不到任何有关如何使用 python 谷歌云存储的批处理功能的示例 我看到它存在here https github com GoogleCloudPlatform google cloud python blob master stora
  • Indexeddb:onsuccess 和 oncomplete 之间的区别?

    当 IndexedDB 事务完成或成功时 我使用两个不同的事件来响应回调 比方说 db IDBDatabase 对象 tr IDBTransaction 对象 os IDBObjectStore 对象 tr db transaction o