为什么连接到indexedDB时,有时会在onupgradeneeded之前调用onsuccess?

2024-03-19

我在使用 IndexedDB 时遇到问题。在 Firefox 18 上,当我创建新数据库时,onsuccess方法同时被调用有onupgradeneeded。在 Chrome 24 上(这是我想要的行为),onsuccess方法仅在之后调用onupgradeneeded方法已完成。

根据 IndexedDB 上的 MDN 信息,我的印象是,当调用 onsuccess 方法时,使用数据库是安全的,但这使得它看起来不像在 Firefox 中。

(function(){
  app = {};

  // These will hold the data for each store.
  app.objectstores = [
    { name: 'UNIVERSITIES',
      keyPath: 'UID',
      autoIncrement: false,
      data_source: 'http://mysites.dev/nddery.ca_www/larelance/data/universite.json' },
  ];

  // Some information pertaining to the DB.
  app.indexedDB    = {};
  app.indexedDB.db = null
  app.DB_NAME      = 'testdb';
  app.DB_VERSION   = 1;

  /**
   * Attempt to open the database.
   * If the version has changed, deleted known object stores and re-create them.
   * We'll add the data later.
   *
   */
  app.indexedDB.open = function() {
    // Everything is done through requests and transactions.
    var request = window.indexedDB.open( app.DB_NAME, app.DB_VERSION );

    // We can only create Object stores in a onupgradeneeded transaction.
    request.onupgradeneeded = function( e ) {
      app.indexedDB.db = e.target.result;
      var db = app.indexedDB.db;

      // Delete all object stores not to create confusion and re-create them.
      app.objectstores.forEach( function( o ) {
        if ( db.objectStoreNames.contains( o.name ) )
          db.deleteObjectStore( o.name );

        var store = db.createObjectStore(
          o.name,
          { keyPath: o.keyPath, autoIncrement: o.autoIncrement }
        );

        app.indexedDB.addDataFromUrl( o.name, o.data_source );
      });
    }; // end request.onupgradeneeded()

    // This method is called before the "onupgradeneeded" has finished..??
    request.onsuccess = function( e ) {
      app.indexedDB.db = e.target.result;
      app.ui.updateStatusBar( 'Database initialized...' );

      // ***
      // Would like to query the database here but in Firefox the data has not
      // always been added at this point... Works in Chrome.
      //
    }; // end request.onsuccess()

    request.onerror = app.indexedDB.onerror;
  }; // end app.indexedDB.open()


  app.indexedDB.addDataFromUrl = function( store, url ) {
    var xhr = new XMLHttpRequest();
    xhr.open( 'GET', url, true );
    xhr.onload = function( event ) {
      if( xhr.status == 200 ) {
        console.log('*** XHR successful');
        // I would be adding the JSON data to the database object stores here.
      }
      else{
        console.error("addDataFromUrl error:", xhr.responseText, xhr.status);
      }
    };
    xhr.send();
  }; // end app.indexedDB.addDataFromUrl()
})();

Thanks!


您可能遇到的问题之一是indexeddb 中的自动提交功能。如果事务在短时间内变得不活动,它将提交该事务并关闭它。

在您的情况下,您正在调用异步方法来填充数据,这就是事务可能变得不活动的原因。如果在 app.indexedDB.addDataFromUrl( o.name, o.data_source ); 之后添加 console.write您将看到它将在检索数据之前被调用,从而导致事务的提交。这就是调用成功回调时数据不存在的原因。 Chrome 中的事务超时可能比 Firefox 中的要长。规范中没有对此进行描述,因此它可能会因供应商而异。

顺便说一句,如果您想在 ajax 调用中添加数据,您还必须将对象存储作为参数传递。

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

为什么连接到indexedDB时,有时会在onupgradeneeded之前调用onsuccess? 的相关文章

  • 如何在 Asp.Net MVC 上实现客户端 Ajax 登录(Asp.Net Webforms 解决方案的链接位于此处)

    我正在尝试在 Asp Net MVC 上实现客户端 ajax 登录 我以前在 WebForms 上设置得很好 但现在我已经转向 MVC 这给我带来了一些麻烦 如果您想要有关 Asp Net Webforms 的客户端 Ajax 登录的教程
  • 如何在没有数据库的情况下创建AJAX分页?

    是否可以在没有 MySQL 帮助的情况下获取 AJAX 分页页面 难道我不能只添加一个包含我需要显示的文本和标记的 PHP 文件 然后通过单击页码将该内容提供给用户吗 那么可以用纯 jQuery 和 PHP 来实现吗 您会使用什么代码方法来
  • 如何使用 QuerySelector 获得第二个匹配项?

    以下语句给出了该类的第一个元素titanic element document querySelector titanic 我如何检索具有相同类的第二个元素 Use document querySelectorAll https devel
  • 递归链接 Promise

    我正在开发一个简单的 Windows 8 应用程序 我需要在其中从网站获取一组数据 我正在使用 WinJS xhr 来检索此数据 它返回一个 Promise 然后 我将回调传递到此 Promise 的 then 方法中 该方法为我的回调提供
  • Android:等待 firebase valueEventListener

    我正在尝试使用信号量来等待我的 firebase valueEventListener 我有一个用户信息活动 其中包含用户必须填写的 6 个不同字段 当用户保存他 她的信息时 我想进行 全有或全无 类型的检查 某些用户信息不能重复 例如用户
  • 如何使用 Eclipse 作为 Javascript IDE?

    我从官方下载页面下载了 eclipse Javascript IDE 但是 当我启动应用程序时 它显示 必须提供 Java 运行时环境或 Java 开发工具包才能运行 eclipse 我已经有一个运行良好的 eclipse 的 java I
  • Ember:命名出口错误

    我不知道为什么我的模板没有在指定的插座中呈现 这是我第一次尝试学习 ember 我被困在指定的渠道上 我想渲染侧边栏模板 in the outlet sidebar 和内容模板 in the outlet content 但我不断在控制台中
  • 如何比较两个对象数组并更改两个数组中找到的对象的值?

    假设我有两个对象数组 let array1 id 1 name snow id 4 name jo id 8 name bran id 12 name gondo id 13 name peter
  • 输入和文本区域可以拖动吗?

    MDN 规范以及我能通过 Google 找到的每个网站都说所有 HTML 元素都可以拖动 然而 在实践中 我发现我无法拖动文本输入或文本区域 即使它们已被禁用 例如 使用以下代码 img src http www placehold it
  • 如何在 Web 应用程序中使用 Javascript 安全地访问 Windows Azure 移动服务?

    我需要一本 web javascript 安全入门书 根据如何使用 Windows Azure 移动服务的 HTML JavaScript 客户端 http www windowsazure com en us develop mobile
  • jqPlot DateAxis tickInterval 不起作用

    我试图每月绘制一个包含单个数据点的图表 我会在每个月的第一天将其作为一个点发送到 jqPlot jqplot actualChart 2011 10 01 0 296 2011 11 01 0 682 title programSelect
  • CSS 按钮将线性渐变背景转换为透明背景

    我有一个带有线性渐变背景 橙色边框和一些文本的按钮 当我将鼠标悬停在按钮上时 我希望背景变得透明 而不更改按钮的其他属性 我尝试将不透明度转换为 0 但显然 这会隐藏边框和文本 我也尝试过转换背景 但它不起作用 因为我没有要转换到的端点 因
  • 将命令行参数传递给 emscripten 生成的应用程序

    当使用 Emscripten 编译 C 程序时 会生成一个 HTML 页面来显示程序的结果 我想知道如何将命令行参数传递给应用程序 例如 对于原始的 C 程序 它是 bfs 32 1 我能够通过向生成的 html 文件添加一行来传递命令行参
  • 使用 Lodash 循环 JavaScript 对象中的属性

    是否可以循环访问 JavaScript 对象中的属性 例如 我有一个 JavaScript 对象定义如下 myObject options property1 value 1 property2 value 2 属性将动态添加到该对象 有没
  • 如何在javascript中删除对象的一部分

    这是我的代码 var data btn click function total data push id total cell val1 val2 val3 每次用户点击btn按钮 我向数据对象添加一些值 现在我的问题是如何删除有的部分i
  • 关于 Node.js Promise then 和 return?

    我对承诺感到困惑 I use 那么就答应没有返回像这样 new Promise resolve reject gt resolve 1 then v1 gt console log v1 new Promise resolve reject
  • Struts html:text 标签内的 HTML5 占位符

    我在 Web 应用程序中使用 Struts 1 3 10 并且希望我的文本字段有一个占位符 不幸的是 当前的 Struts taglib 无法识别此属性 如果可能的话 我希望避免使用 javascript 你知道有什么解决办法吗 Strut
  • 您最喜欢的 JS/CSS 下拉菜单是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 希望在网站上实现一个 只是好奇其他人都使用过什么以及他们有过什么样的体验 EDIT我也不是一个超级粉丝
  • 当 mp4 是唯一来源时,自定义 HTML5 视频控件不起作用

    问题 我只有一个视频源 mp4 因为我正在尝试向 tumblr 视频添加自定义控件 如果只有mp4作为源video duration返回为NaN 作为使用 3 个源 mp4 webm ogg 时的测试 它可以工作 所以video durat
  • 与 body 相比,将 css 规则应用于 html 有什么区别?

    我看不出以下之间的区别 html background f1f1f1 and body background f1f1f1 有什么解释吗 没有真正的区别 如果你只是谈论在哪里申请background 否则BoltClock 对另一个问题的回

随机推荐

  • Objective-C 中的自动解析库 - [自动 XML/JSON 到对象转换]

    Objective C 中是否有一个我可以在 iPhone 中使用的库 在其中我可以提前告诉库这些标签应该在 xml 文件中出现 然后该库会自动为我解析它并给我一个 NSDictionary 数组作为回报或类似的东西 简而言之 我正在寻找一
  • 为什么本机 python 列表上的 for 循环比 numpy 数组上的 for 循环更快

    我正在阅读介绍 numpy 的章节高性能Python并在我自己的计算机上使用了代码 我无意中用 for 循环运行了 numpy 版本 发现与本机 python 循环相比 结果出奇地慢 代码的简化版本如下 其中我定义了一个值为 0 的二维数组
  • 如何使用 Chrome 扩展程序阻止某些网站?

    我正在为一个项目制作一个简单的 chrome 扩展 我正在制作一个扩展程序来阻止某些 URL 社交媒体等 以使学习更加高效 我不太擅长JS 但我想学习 我有一些想法 也许它可以阻止网站 或者只是在 div 中绘制一些内容来阻止其内容 另外
  • 如何设置PDF页眉的高度?

    有谁知道如何设置生成的pdf中标题的高度
  • x64应用程序访问mdb数据库

    我有一个应用程序需要在x64平台下构建 我需要访问 mdb文件 我所说的访问是指插入 删除或更新数据库 我在使用 Jet OLE db 和 ODBC 驱动程序时遇到问题 对于 OLE db 它显示 Jet Oledb 未注册 驱动程序和应用
  • Haskell 的全功能 CSV 解析器?

    任何人都可以推荐一种解析 CSV 文件的方法 其中包含以下选项 设置单元格 字段分隔符 设置记录结尾 行终止符 为字段设置引号字符 支持 UTF 8 字符串 能够将内存中的 CSV 结构写回文件 我确实尝试过 Text CSV 但它非常简单
  • D3 力向图添加新节点导致 x & y 为 NaN

    当我单击一个节点时 我希望向其中添加一个新节点 它们都应该有标签 我正在尝试构建同义词库可视化 我对 D3 还很陌生 所以如果您需要更详细地解释一些事情 我深表歉意 到目前为止 这是我的代码 var width 960 var height
  • 如何防止在 C# 中手动输入组合框

    我有一个 C 表单 它使用ComboBox 如何防止用户手动输入文本ComboBox in C this comboBoxType Font new System Drawing Font Arial 15 75F this comboBo
  • 未调用 UIManagedDocument saveToURL finishHandler - 错误消息:“不允许读者访问该 URL。”

    我有一个旧的应用程序使用UIManagedDocument与核心数据交互 然而 在 iOS 11 2 可能还有更早的 iOS 11 版本 上saveToURL forSaveOperation completionHandler 方法似乎已
  • 将文件扩展名与程序关联

    我知道怎么做 而且我去过http www codeproject com KB vb VBFileAssociation aspx http www codeproject com KB vb VBFileAssociation aspx前
  • 在python中将pdf转换为docx格式

    请问如何将pdf转换为docx 我尝试使用 pdfminer 转换为 html 来提取文本 但看起来仍然不够好 pdf2docx 安装pdf2docx包点击here https github com dothinking pdf2docx
  • Dialogflow动态实体问题

    我正在尝试使用 Dialogflow api ai 创建一个 Actions on Google 应用程序 我需要获取火车状态 所以我的实体将是火车号码或火车名称 火车的名字有很多 所以我无法手动添加实体值 如何将实体值动态添加到控制台 您
  • Spring WebFlux Webclient 作为 Mono 接收应用程序/八位字节流文件

    我正在 Kotlin 中制作一个小型 Spring WebFlux 应用程序的原型 该应用程序需要从远程 REST 端点获取 tar 存档并将其存储在本地磁盘上 听起来很简单 我首先创建了一个集成测试 该测试启动 Spring 服务器和另一
  • NHibernate Definitive Cascade 应用指南

    是否有任何互联网资源对 NHibernate 的所有级联设置提供明确的指南 其中包括类结构 HBM 以及每个级联设置的操作对与 NH 的所有关系的影响的示例 此外 如果有以最正确的方式完成常见关联的示例 例如设置一个状态表 您将永远不会最终
  • 沸腾的 MSYS shell - 它可以更换吗?

    我需要一个适用于 MSYS 的可用外壳 这是我目前的困境 默认的 rxvt exe 有一个滚动条以及复制和粘贴功能 但不会将控制字符或箭头键发送到 shell 中正在运行的程序 如解释器 调试器 当使用 Haskell 解释器 ghci 时
  • ASP.NET MVC - ID 字段的自定义模型绑定器

    我有以下实体 public class Category public virtual int CategoryID get set Required ErrorMessage Section is required public virt
  • GitoLite 和 Git 可以使用 LDAP 而不是 SSH 密钥吗

    我的公司正在考虑使用 git 和 gitolite 但不想使用 SSH 密钥 而是像使用 LDAP 一样工作 这可以做到吗 我从来没有见过这样做 我在每个地方都有这个设置 并且总是使用 SSH 密钥 是的 您可以毫无问题地做到这一点 你只需
  • Selenium:指向默认 Chrome 会话

    虽然我意识到这不是 好的 做法 我有一个用例 我需要将 Selenium 驱动程序指向 连接 到我的默认 Chrome 会话 配置文件 我的默认配置文件在这里 Library Caches Google Chrome Default 这是我
  • 在 Swift 中从字符串创建 ZIP 文件

    let data InPractiseThisWillBeAReheallyLongString createDir let docsDir FileManager default urls for documentDirectory in
  • 为什么连接到indexedDB时,有时会在onupgradeneeded之前调用onsuccess?

    我在使用 IndexedDB 时遇到问题 在 Firefox 18 上 当我创建新数据库时 onsuccess方法同时被调用有onupgradeneeded 在 Chrome 24 上 这是我想要的行为 onsuccess方法仅在之后调用o