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

vshtjzan  于 2023-02-01  发布在  IndexedDB
关注(0)|答案(3)|浏览(328)

我在回答这个问题之前,先说我是indexedDB和异步javascript的新手。我正在为一个chrome应用程序编写一个函数,该函数接收一个名为sourceBlob的Array缓冲区,并将其存储在indexedDB中。然后,该函数在indexedDB中打开一个数据库,该数据库是我之前在应用程序启动时创建的,并启动了一个与该数据库的事务。由于某种原因,当我执行此代码请求时。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();
    };

  };
};
bbmckpt7

bbmckpt71#

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

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

您将看到显示“onsuccess”。
我建议你试着做一个完整的最小的例子来说明你的问题。在这样做的过程中,你可能会找到解决方案。

kb5ga3dv

kb5ga3dv2#

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

    }
};
wz1wpwve

wz1wpwve3#

(My答案可能与OP的问题无关,但可能对刚学习indexedDB且不熟悉javascript的人有帮助)
确保你的处理程序在创建请求对象的同一时期注册(特别是在控制台中,你应该键入多行代码并一次执行它们,而不是稍后保存请求和绑定处理程序)。
Image等DOM元素不同,Image允许您在实际触发请求之前注册处理程序:

let i = new Image();
i.onload = (e)=>{ console.log("image is loaded"); }
i.src = "some/url.png";

indexedDB请求在发出时被激发,对handler的调用(“稍后”注册)由javascript并发模型确保。

var request = indexedDB.open("test", 1);
// request may already done at this point, 
// however, the event is delayed to next javascript epoch, 
// so you can register the handler after `request` is created.
// and ensure the handler is called.

request.onsuccess = function(e) { console.log("onsuccess"); }
request.onerror = function(e) { console.log("onerror"); }

相关问题