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

时间:2014-12-15 22:21:47

标签: javascript asynchronous google-chrome-app indexeddb

我在这个问题前面提到了我不熟悉使用indexedDB和异步javascript的事实。我正在为chrome应用程序编写一个函数,它接受一个名为sourceBlob的Array缓冲区并将其存储在indexedDB中。然后,该函数在indexedDB中打开一个数据库,该数据库先前在应用程序启动时创建,并启动与该数据库的事务。出于某种原因,当我执行此代码时,请求完全被跳过,因此我无法将我的数据添加到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();
    };

  };
};

2 个答案:

答案 0 :(得分:0)

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

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

您将看到显示“onsuccess”。

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

答案 1 :(得分:0)

在应用程序工作了一段时间之后,我意识到在放弃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;

    }
};