当indexedDB被阻止时应用程序应该如何反应

2024-01-15

我在另一个地方被告知question https://stackoverflow.com/questions/39997018关于检测阻止和解除阻止事件,“阻止的打开(或删除)不会被取消,只是......被阻止。一旦解除阻止,打开(或删除)将继续。”

我想知道应用程序应该如何响应被阻止的事件,如果成功事件之后的路径最终仍然会发生的话。

如果我希望我的应用程序响应quickly,并且遇到阻塞事件,我应该取消成功路径吗?通过路径,我指的是在成功打开数据库时执行的一系列语句和函数调用以及延续。

之前我假设被阻止的事件阻止了成功路径的继续。我编写了我的应用程序,将阻止的事件视为类似于错误,这意味着操作无法继续,并且应该报告错误,然后执行其他操作或返回空闲状态。

对我来说问题是,如果成功事件最终可以继续,那么这意味着我正在分叉,并且错误路径和成功路径都会评估,并且可能会导致一些不需要的行为。

或者我最初的理解是正确的,我不需要担心取消成功时发生的事情,因为如果 onblocked 火灾那么我可以安全地推断 onsuccess 不会。

做下面这样的事情感觉真的很难看,但这是我能想到的唯一可以避免我的问题的直接方法。

var r indexedDB.open(...);
var wasPreviouslyBlocked = false;
r.onsuccess = function() {
  // Cancel the success if previously blocked
  if(wasPreviouslyBlocked) {
    return;
  }
  // Proceed as normal
  doNextThing();
};
r.onblocked = function() {
  wasPreviouslyBlocked = true;
};

有没有更好的方法来应对这种情况?


对我来说问题是如果事件最终能够成功 continue,那么这意味着我正在分叉,并且错误路径和 成功之路将会评估,并且可能会导致一些结果 不需要的行为。

那是对的。

或者我最初的理解是否正确,我不需要担心 取消成功时发生的事情,因为如果 onblocked 火灾 那么我可以有把握地推断 onsuccess 不会。

如有疑问,请实际尝试一下!您所需要的只是几个选项卡和本地服务器。添加日志记录到blocked, success, and upgradeneeded请求的处理程序和versionchange连接的处理程序。

作为背景,假设一个选项卡打开数据库的 v1:

var r = indexedDB.open('db', 1);
r.onupgradeneeded = function(e) {
var db = r.result;
  // schema v1: has store s1
  db.createObjectStore('s1');
};
r.onsuccess = function(e) {
  window.db = r.result;
};

现在打开第二个选项卡并拉下想要升级的新代码:

var r = indexedDB.open('db', 2);
r.onupgradeneeded = function(e) {
  // schema v1: has store s1
  // schema v2: adds store s1
  var db = r.result;
  if (e.oldVersion < 1) {
    db.createObjectStore('s1');
  }
  db.createObjectStore('s2');
};
r.onblocked = function(e) {
  console.log('uh oh...');
};

您至少可以采取三种通用方法来应对升级受阻。

  1. 监视“旧”连接versionchange事件并立即关闭以解锁升级。
  2. 留意“新”连接blocked事件并通知用户关闭其他选项卡
  3. 留意“新”连接blocked事件并忽略升级。

既然您对#3 感兴趣,那么您将如何实现它:

var r = indexedDB.open('db', 2);
r.onupgradeneeded = function(e) {

  // If we ever saw a blocked event, abort this upgrade.
  if (r.was_blocked) {
    r.transaction.abort();
    return;
  }

  var db = r.result;
  if (e.oldVersion < 1) {
    db.createObjectStore('s1');
  }
  db.createObjectStore('s2');
};

r.onblocked = function(e) {
  // Record that we saw a blocked event so this upgrade
  // can be ignored.
  r.was_blocked = true;
};

这与您最终得到的结果非常接近wasPreviouslyBlocked尝试,但您的代码中存在一个严重错误:您没有中止升级,只是没有实际修改架构。因此,您最终将得到一个具有架构版本 2 的数据库,但没有任何与 v2 相比的更改。如果数据库再次打开,它将已经处于 v2,因此升级不会触发,并且您将错过预期的架构更改。

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

当indexedDB被阻止时应用程序应该如何反应 的相关文章

  • 如何检查indexedDB实例是否打开?

    假设我有一个 indexedDB 对象的实例 有没有一种简单的方法来检测对象当前是否处于 打开 状态 我试过了database closePending并查看其他属性 但没有看到一个简单的属性来告诉我数据库的状态 我希望同步执行此操作 尝试
  • TransactionInactiveError:无法在“IDBObjectStore”上执行“添加”:事务未激活

    在这段代码中我面临的问题是store1 add当我查看控制台时它说TransactionInactiveError Failed to execute add on IDBObjectStore The transaction is not
  • indexedDB 最高键路径

    我在 indexedDB 中有一个使用 Emberjs 适配器填充的数据库 我已经像这样设置了键路径 this addModel App Device keyPath key 当我第一次解析数据时 我的密钥会自动递增 如下所示 data d
  • 如何从javascript同步调用indexeddb方法

    我有一种方法说method1在 javascript 中 有另一种方法说method2 call method2在 method2 调用之后返回 method1 中需要的一个值 var userObj first Key 1 value s
  • 如何在 IndexedDB 中保存对象?

    我想将我的API数据存储在浏览器的indexedDB中 我本想尝试本地存储 但它的限制为 5MB 但我的 JSON 数据超过 7MB 我想保存在indexedDB中以便更快地访问 我想以 JSON 格式保存整个数据 但不知道如何设置索引数据
  • indexedDB openCursor 事务成功返回空数组

    req db openCursor req customerData new Array a 1 req onsuccess function e var cursor e currentTarget result if cursor co
  • 从 MySQL 到 IndexedDB

    再会 我不确定我的问题是否可能 这就是我问的原因 我正在开发一个应用程序 它在线时使用 PHP MySQL 但离线时使用 indexedDB 好吧 这就是目标 对于用户来说 只是读取数据库 无需写入任何内容 在线时 我想填充 indexed
  • 如何通过缓存制作离线地图(使用leaflet OSM)?

    我正在尝试通过浏览器中的缓存 IndexedDB 制作离线地图 我理解的概念是 当连接到互联网时 我首先下载并存储地图的图块 然后我必须逻辑上离线加载图块 但是 我无法弄清楚 如何存储它们以及如何逻辑地再次加载它们 我被困在这里了 我正在使
  • IndexedDB 查看所有数据库和对象存储

    我在 Windows 8 应用程序中使用 IndexedDB 而且我对两者都很陌生 我已经能够成功地从对象存储中创建 读取 更新和删除对象 并创建了几个数据库和一些对象存储 我的问题是如何列出我的所有对象存储和数据库 我创建了一些不需要的假
  • 使用 create-react-app 添加更多 service-worker 功能

    因此 create react app 包含 Service Worker 功能默认情况下 https github com facebookincubator create react app blob master packages r
  • 为什么此 IndexedDB put 命令失败?错误:DataError:DOM IDBDatabase 异常 0

    创建对象存储时 我已成功将以下内容添加到该对象存储中 name John Doe age 21 我使用了以下选项 keyPath id autoIncrement true 我能够找到该记录 它显示了id 1 但是 当我运行下面的命令时 它
  • Dexie 数据库超时变慢

    我正在将 Dexie DB 版本 2 0 4 与 Angular 8 和 Electron 一起使用 我意识到 在数据库中输入的数据越多 对其进行的查询越多 数据库调用就会变得越慢 我是一个 Dexie 菜鸟 不确定在发出某些请求后是否有办
  • IndexedDB回调不更新AngularJS中的UI

    我正在使用以下库在新的 Chrome 应用程序上访问 Angularjs 中的 IndexedDB https github com aaronpowell db js https github com aaronpowell db js
  • 当indexedDB被阻止时应用程序应该如何反应

    我在另一个地方被告知question https stackoverflow com questions 39997018关于检测阻止和解除阻止事件 阻止的打开 或删除 不会被取消 只是 被阻止 一旦解除阻止 打开 或删除 将继续 我想知道
  • Indexeddb:onsuccess 和 oncomplete 之间的区别?

    当 IndexedDB 事务完成或成功时 我使用两个不同的事件来响应回调 比方说 db IDBDatabase 对象 tr IDBTransaction 对象 os IDBObjectStore 对象 tr db transaction o
  • 删除indexedDB对象存储中特定索引值的所有记录

    对于数组键为的对象存储 a b where a也是一个索引 有没有更有效的方法来删除特定值的所有记录a而不是在索引上打开游标a并通过光标逐步删除每条记录 有没有办法只为索引定义键范围 或者只为索引定义键范围a然后离开b打开任何值 以便可以删
  • Ajax IndexedDB 删除当前成功上传

    我昨天发布了类似的内容 但它有效 但只删除了数据中的最后一个对象 我想要发生什么 这个ajax上传将处理大量数据 所以我使用indexeddb 这也将在手机上使用 因此 我希望它一次上传一项 如果一项失败 则仅删除数据中的前一项 这样他们就
  • 将图像文件存储在 IndexedDB 中

    我在尝试将图像文件存储在 IndexedDB 中时遇到问题 我抓取文件对象并尝试将其推送到 IndexedDB 中 但它似乎抛出错误 DOM Exception DATA CLONE ERR 25 如何将如下所示的文件对象转换为可以存储在
  • 防止IndexedDB请求错误取消事务

    我的意图 循环localStorage并将数据放入IndexedDB 如果发生某些已知错误 例如当键已存在时出现 ConstraintError 我想忽略这些特定错误 以便事务不会中止 当请求触发错误时 中止事务是默认行为 问题 我以为使用
  • 如何从事件处理程序返回indexedDB查询结果?

    我必须从indexedDB返回查询结果 但结果只能在onsuccess事件处理程序 1 function listPeople 4 var open indexedDB open AccordionDatabase 1 5 res 6 7

随机推荐

  • 安全性:我应该如何存储(“记住”)用户的用户名和密码以供将来使用?

    我需要我的应用程序能够记住用户的用户名和密码 以便用户将来不必再次输入 显然 为了 记住 用户名和密码以供将来使用 这意味着我的应用程序必须以某种方式将用户名和密码存储到磁盘 这通常是如何完成的 我知道 Pidgin 以纯文本形式存储用户名
  • 高阶函数有哪些有趣的用途?

    我目前正在学习函数式编程课程 我对高阶函数和一等公民函数的概念感到很有趣 然而 我还想不出许多实际有用的 概念上令人惊奇的或只是简单有趣的高阶函数 除了典型的 相当沉闷的map filter等功能 您知道此类有趣函数的示例吗 也许是返回函数
  • 图像和 div 的最大可能尺寸扩展以填充空间

    我确信以前有人问过这个问题 但我找不到确切问题的答案 我想要一个非常简单的布局 header content graphic where 页眉高度由字体大小设置 内容有固定的最小宽度 考虑到这两个限制并保持纵横比 图形尽可能大 即 它将与屏
  • jqGrid 子网格的 JSON 对象

    这是我关于 jqGrid 子网格的 JSON 数据的第三个问题 到目前为止我还没有得到任何评论 请有人帮忙 my 第一个问题 https stackoverflow com questions 6647302 subgrid in jqgr
  • GetHashCode() 经常重写碰撞方式

    我正在使用 Unity 而 Unity 中没有元组 因此我创建了自己的元组类来工作 因为我的字典需要它 Dictionary
  • 从特定链接读取流

    我需要使用 OpenCV 库从 mjpeg 读取流 更详细的信息 我需要阅读http 194 126 108 66 8887 但是当我尝试这样做时 VideoCapture ipCam ipCam open http 194 126 108
  • 是否可以对网页中的 iframe 进行截图?

    我正在尝试截取网页中 iframe 的屏幕截图 在我的特定情况下 iframe 包含我的一位客户商店的街景视图 据我搜索和阅读 我没有找到任何解决方案 我知道有像这样的 JavaScript 库Html2Canvas and Canvas2
  • 如何将数据库从一台 MongoDB 服务器复制到另一台服务器?

    我在不同的服务器上有两个 mongodb 都以 auth 现在我想将数据库从一台服务器复制到另一台服务器 gt mongo gt use admin gt db copyDatabase mydb mydb another server 表
  • Python中Matlab的datenum(datestring)的等价函数

    在 Matlab 中 当我运行 datenum http de mathworks com help matlab ref datenum html 功能如下 datenum 1970 1 1 我得到以下输出 719529 我试图找到等效的
  • 如何升级 Windows 10 中的 Python 安装?

    我的一个 LAB 工作站上安装了 Python 2 7 11 我想将 Python 至少升级到 3 5 我该怎么做呢 我是否应该完全卸载 2 7 11 而不是安装新版本 有办法更新吗 更新是个好主意吗 Python 的每个次要版本 即任何
  • 如何重置 COMP_WORDBREAKS 而不影响其他完成脚本?

    当我实现 bash 自动完成功能时 有些事情让我感到困惑 我将把它放入 etc bash completion d 为了实现某些功能 我想删除分词字符冒号 来自变量 COMP WORDBREAKS并添加斜杠 开始于 COMP WORDBRE
  • 如何使用 iGraph 在 R 中挖掘主题

    我正在尝试使用该包在 R 中挖掘 3 节点图案igraph 我想检索图中每个单独顶点的图案数量 这在 graph motifs 函数中似乎不可能 因此 对于示例图 testGraph barabasi game 10 m 5 power 2
  • 将 TFS 项目转换为 git 存储库的最佳方法是什么

    我知道 VS2012 中对 git 的支持已经有了很多进展 我们目前有一个 Team Foundation Server 2012 更新 2 其中我们的所有项目都以经典 TFS 格式存储 我们希望从 TFS 迁移到纯 git repo 系统
  • 添加内存地址错误

    这无法在 VSC 2008 中编译 void toSendMemory2 toSendMemory 4 我不知道为什么 尽管我确信我这样做很愚蠢 P 当你添加N to a T 指针将增加sizeof T N bytes sizeof voi
  • Visual Studio 2013 C++ lambda 捕获参数包

    目前 Visual Studio 2013 update 2 不支持完整的 C 11 其中一项功能是捕获 lambda 中的参数包 有没有一种简单的方法可以解决这个问题 或者我是否必须放弃 Visual Studio 并使用兼容的编译器 例
  • IE7:如何让TD浮动?

    我想要一套 td s 在 IE7 中向左浮动 如果窗口太小 它们应该中断到下一行 CSS table width 100 td border 1px solid red tr f td width 500px float left HTML
  • 托管 Angular 2 应用程序

    我是新来的Angular 2 我认识楼主Angular 1 x在共享主机上 例如GoDaddy 但我不知道如何发布Angular 2应用程序 例如我有这个结构文件夹 angular2 quickstart app app component
  • 如何使用所有模型的通用 Trait 在 Laravel 中实现 eloquent 事件

    我在用拉拉维尔 5 4创建一个网络应用程序 我创建了一个特征来实现创建 更新 删除和恢复雄辩事件的事件 我创建了一个trait如下
  • 如何使用 AngularJS 更改一个 div 上的类,同时将鼠标悬停在另一个 div 上?

    我想使用 AngularJS 指令更改一个 div 的类 同时将鼠标悬停在另一个 div 上 这是我到目前为止所拥有的http jsfiddle net E8nM5 38 http jsfiddle net E8nM5 38 HMTL di
  • 当indexedDB被阻止时应用程序应该如何反应

    我在另一个地方被告知question https stackoverflow com questions 39997018关于检测阻止和解除阻止事件 阻止的打开 或删除 不会被取消 只是 被阻止 一旦解除阻止 打开 或删除 将继续 我想知道