在为JavaScript变量赋值时发出问题

时间:2011-08-08 07:09:49

标签: javascript firefox object

我在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学到一些东西。

一定有一件我想念的简单事情。

3 个答案:

答案 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)。

函数(事件)中的参数可能具有“结果”值。