为啥我的 indexedDB.open.onsuccess 事件没有被调用?

Posted

技术标签:

【中文标题】为啥我的 indexedDB.open.onsuccess 事件没有被调用?【英文标题】:Why is my indexedDB.open.onsuccess event not called?为什么我的 indexedDB.open.onsuccess 事件没有被调用? 【发布时间】:2015-02-14 03:37:48 【问题描述】:

我以我不熟悉 indexedDB 和异步 javascript 的事实作为这个问题的开头。我正在为 chrome 应用程序编写一个函数,该函数接收一个名为 sourceBlob 的数组缓冲区并将其存储在 indexedDB 中。然后,该函数在 indexedDB 中打开一个我之前在应用程序启动时创建的数据库,并使用该数据库启动一个事务。由于某种原因,当我执行此代码时 request.onsuccess 被完全跳过,因此我无法将我的数据添加到 objectStore。如何确保 request.onsuccess 被执行?我读过这个问题可能是由于 indexedDB 是异步的,但我还没有找到有效的解决方案来解决这个问题。

data.indexedDB.addSource = function(sourceBlob) 
//adds source to data base
  var version = 1;
  var request = indexedDB.open("content", version);
  request.onerror = errorHandler;
  request.onsuccess = function(e) 
    db = e.target.result;
    var trans = db.transaction(["nContent"], "readwrite");
    var store = trans.objectStore("nContent");
    var request = store.put(sourceBlob);
    trans.oncomplete = function(e) 
      data.indexedDB.getIndexedSource();
    ;

  ;
;

【问题讨论】:

也许错误处理程序被调用了? “跳过”是什么意思?正如您提到的异步问题,您希望代码做什么? 我检查了,也没有调用错误处理程序。我与 onsuccess 事件绑定的函数永远不会被调用。我希望一旦打开数据库,就会触发 onsucces 事件,因此我的打开事务的函数将被执行。 你的errorHandler函数定义了吗?如果不是,那可能会导致问题。 是的,我的 errorHandler 函数已定义并且在我程序的不同部分正常运行。 【参考方案1】:

您确定正在调用data.indexedDB.addSource 吗?因为您可以打开浏览器的 JS 控制台(甚至在此页面上)并运行:

var request = indexedDB.open("content", 1);
request.onsuccess = function(e)  console.log("onsuccess"); 

您将看到显示“onsuccess”。

我建议您尝试制作一个完整的最小示例来显示您的问题。在这样做的过程中,您可能会找到解决方案。

【讨论】:

是的,我很肯定 data.indexedDB.addSource 正在被调用。当我逐步执行我的函数时,我会进入 data.indexedDB.addSource 但是在调用该函数后,打开数据库的 onsuccess 或 onerror 事件不会被触发。 好的,我仍然建议您尝试制作一个完整的最小示例来显示您的问题。我发布的两行代码本身就可以正常工作。您的整个大型代码库都没有。从你的代码中剔除一些东西,直到它开始工作,你会发现你的问题。如果您仍然无法弄清楚,请在此处发布您的最小示例代码,它会更容易为您提供帮助。 嘿笨蛋。我非常感谢您的帮助,但我能够解决问题。由于我在函数中打开数据库,因此我会在触发任何事件之前退出函数。我为我的函数添加了延迟,现在我的事件有时间在我退出函数之前触发。 很高兴你能够让它工作!虽然我怀疑还有其他事情发生,但您的解释听起来不正确,您的解决方案看起来也不应该做任何事情。 如果你愿意,我可以把我的代码发给你,它很短。我想我正在做的是阻止退出函数,直到异步事件被触发,从而使它像同步函数一样“行动”。【参考方案2】:

在应用程序上工作了一段时间后,我意识到在触发 onsuccess 事件之前我正在退出 addSource 函数。为了解决这个问题,我在函数末尾添加了一个延迟,事件现在可以正常触发。感谢您的所有帮助。固定代码:

data.indexedDB.addSource = function(sourceBlob) 
//adds source to data base
  var version = 1;
  var request = indexedDB.open("content", version);
  request.onerror = errorHandler;
  request.onsuccess = function(e) 
    db = e.target.result;
    var trans = db.transaction(["nContent"], "readwrite");
    var store = trans.objectStore("nContent");
    var request = store.put(sourceBlob);
    trans.oncomplete = function(e) 
      extron.indexedDB.getIndexedSource();
    ;

  ;
    var token = 100000;
    while(token != 0)
    
      token = token-1;

    
;

【讨论】:

这不可能,对吧? javascript 通常都是单线程的。 这是完全错误的。我不知道实际发生了什么(不打算从 2014 年开始尝试解决某人的问题),但如果您在这里搜索过,请不要复制此内容。

以上是关于为啥我的 indexedDB.open.onsuccess 事件没有被调用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 PHP 会话会死掉?为啥我不能恢复它们?

为啥我的碰撞测试总是返回“真”,为啥图像矩形的位置总是错误的 (0, 0)?

NPM 启动错误上的 ENOENT。为啥我会收到此错误,为啥要查找“我的图片”目录?

为啥 main 前面有一个 int ,为啥我的教授会排除它? [复制]

为啥我的 Entity Framework Code First 代理集合为空,为啥我不能设置它?

为啥我的 UISearchController 很慢?