我在回答这个问题之前,先说我是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();
};
};
};
3条答案
按热度按时间bbmckpt71#
你确定
data.indexedDB.addSource
正在被调用吗?因为你可以打开浏览器的JS控制台(甚至在这个页面上)并运行以下命令:您将看到显示“onsuccess”。
我建议你试着做一个完整的最小的例子来说明你的问题。在这样做的过程中,你可能会找到解决方案。
kb5ga3dv2#
在应用程序上工作了一段时间后,我意识到我在触发onsuccess事件之前退出了addSource函数。为了解决这个问题,我在函数末尾添加了一个延迟,现在事件可以正常触发了。感谢您的帮助。修复代码:
wz1wpwve3#
(My答案可能与OP的问题无关,但可能对刚学习indexedDB且不熟悉javascript的人有帮助)
确保你的处理程序在创建请求对象的同一时期注册(特别是在控制台中,你应该键入多行代码并一次执行它们,而不是稍后保存请求和绑定处理程序)。
与
Image
等DOM元素不同,Image
允许您在实际触发请求之前注册处理程序:indexedDB请求在发出时被激发,对handler的调用(“稍后”注册)由javascript并发模型确保。