该错误可能是因为您的 db 变量为空。这几乎总是因为您试图将 db 作为回调的结果存储在全局变量中,然后在单独的函数中访问 db 变量,该函数不能保证仅在设置 db 变量后才执行,这样浏览器发现您正在访问一个未初始化的变量。
解决方案很简单(但令人沮丧)。除非您想了解某些库的承诺和延迟对象的实现,否则您不能以这种方式使用全局变量。相反,看看丹尼给出的答案。使用回调并在回调函数中编写代码,而不是全局变量。'db' 只能从回调 request.onsuccess 函数中访问,并且不是全局的。这就是Deni's会起作用的原因。他的代码只有在保证被初始化(非空)时才会尝试访问 db。
由于您没有发布周围的代码,事实证明这很重要,您需要执行以下操作:
// I am an evil global variable that will not work as expected
myapp.indexedDB.db = 'DO NOT USE ME OR YOU WILL GET AN ERROR';
// I am a good function that only accesses an initialized db variable
function doit() {
var request = window.indexedDB.open(......);
request.onsuccess = function(event) {
// Use this db variable, not your global one
var db = event.target.result;
// Note that you can also access the db variable using other means
// here like this.result or request.result, but I like to use event.target
// for clarity.
// Now work with the db variable
var store = db.transaction(['tree_nodes'],'readwrite').objectStore('tree_nodes');
// do some more stuff with store....
};
}