我在Firefox 5.0中尝试关注:
var db;
var request = mozIndexedDB.open("MyTestDatabase");
request.onerror = function(event) {
alert("Why didn't you allow my web app to use IndexedDB?!");
};
request.onsuccess = function(event) {
db = request.result;
//db = event.target.result; //also tried this
console.log(db); //get the object
};
console.log(db); //undefined
我想要db,可以在处理程序外部访问。这是什么问题? 我正在尝试从this学到一些东西。
一定有一件我想念的简单事情。
答案 0 :(得分:3)
您的db
变量在成功处理程序中分配了一个值:
request.onsuccess = function(event) {
db = request.result;
//db = event.target.result; //also tried this
console.log(db); //get the object
};
该处理程序将以异步方式调用,特别是在执行此操作时尚未调用它:
console.log(db); //undefined
因此您最终获得了db
的初始值var db;
。
因此,您可以在回调之外访问db
,但在您需要时它不一定具有有用的值。通常的方法是在成功处理程序中调用需要db
的东西。如果您需要在其他地方使用db
,则必须在使用之前检查是否已定义,如果不是,则必须等待。
如果在继续申请之前需要等待db
准备就绪,那么这样的事情应该有效:
var timer = setInterval(function() {
if(!db) // Not ready yet.
return;
// We have a db so we can stop waiting
clearInterval(timer);
// and get on with our real work.
start_main_application();
}, 100);
setInterval
将每0.1秒触发一次并检查是否还有db
;如果不是,则在下一次触发间隔之前它什么都不做;如果有db
,则为shuts down the timer并启动主应用程序。
答案 1 :(得分:1)
console.log(db); //undefined
当然,那里没有定义,这是正确的行为。
请参阅,发生了什么:您正在执行请求,并提交处理该请求的处理程序(onsuccess)。初始化发生在处理程序主体中,但事件尚未发生!代码流进入console.log(db); line,但db没有初始化,因为还没有调用handler。
一旦成功发生,就会调用handler并初始化db。只有在那之后你才能使用它。
答案 2 :(得分:0)
似乎请求不会自己设置结果变量(即request.result)。
函数(事件)中的参数可能具有“结果”值。