Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么未调用我的indexedDB.open.onsuccess事件?_Javascript_Asynchronous_Google Chrome App_Indexeddb - Fatal编程技术网

Javascript 为什么未调用我的indexedDB.open.onsuccess事件?

Javascript 为什么未调用我的indexedDB.open.onsuccess事件?,javascript,asynchronous,google-chrome-app,indexeddb,Javascript,Asynchronous,Google Chrome App,Indexeddb,在回答这个问题之前,我要说的是,我对使用indexedDB和异步javascript还不熟悉。我正在为一个chrome应用程序编写一个函数,它接收一个名为sourceBlob的数组缓冲区,并将其存储在indexedDB中。然后,该函数在indexedDB中打开一个数据库,该数据库是我以前在应用程序启动时创建的,并使用该数据库启动事务。由于某些原因,当我执行此代码时,request.onsuccess被完全跳过,因此我无法将数据添加到objectStore。如何确保执行request.onsucc

在回答这个问题之前,我要说的是,我对使用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();
    };

  };
};

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

var request = indexedDB.open("content", 1);
request.onsuccess = function(e) { console.log("onsuccess"); }
您将看到显示“onsuccess”


我建议你试着用一个完整的例子来说明你的问题。在这样做的过程中,您可能会找到解决方案。

在使用该应用程序一段时间后,我意识到在触发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;

    }
};

可能会调用错误处理程序?您所说的“跳过”是什么意思?当您提到异步问题时,您希望代码做什么?我检查了错误处理程序,也没有调用错误处理程序。我绑定到onsuccess事件的函数从未被调用。我希望一旦数据库被打开,onsucces事件将被触发,因此我打开事务的函数将被执行。是否定义了errorHandler函数?如果不是,这可能会导致问题。是的,我的errorHandler函数已定义,并在程序的不同部分正常运行。是的,我确信正在调用data.indexedDB.addSource。当我单步执行我的函数时,我会进入data.indexedDB.addSource,但是在调用该函数后,打开数据库的onsuccess或onerror事件不会被触发。好的,我仍然建议您尝试制作一个完整的最小示例来说明您的问题。我发布的两行代码本身运行良好。你的整个代码库都没有。从你的代码中删除一些东西,直到它开始工作,你就会发现你的问题。如果您仍然无法理解,请在此处发布您的示例代码,这样会更容易帮助您。我真的很感谢你的帮助,但我还是解决了这个问题。因为我是在函数中打开数据库的,所以我会在触发任何事件之前退出函数。我给我的函数添加了一个延迟,现在我的事件有时间在我退出函数之前触发。很高兴你能让它工作!虽然我怀疑还有其他事情发生,但您的解释听起来不正确,您的解决方案看起来也不应该起任何作用。如果您愿意,我可以将我的代码发送给您,它非常简短。我想我所做的是阻止退出函数,直到异步事件被触发,从而使它像同步函数一样“运行”。这是不可能的,对吗?javascript通常都是单线程的。