为JavaScript变量赋值时出现问题

为JavaScript变量赋值时出现问题,javascript,firefox,object,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; //d

我正在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,可在处理程序外部访问。这里的问题是什么? 我正试图从中学到一些东西


我肯定缺少一件简单的事情。

似乎request不会设置结果变量本身(即request.result)


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

请求似乎不会设置结果变量本身(即request.result)


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

您的
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);

每0.1s触发一次,检查是否有
db
;如果不是,则在下次触发间隔之前不会执行任何操作;如果存在
db
,则它将启动主应用程序。

您的
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
该处理程序将被异步调用,尤其是在执行此操作时,尚未调用该处理程序:

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);
每0.1s触发一次,检查是否有
db
;如果不是,则在下次触发间隔之前不会执行任何操作;如果存在一个
db
,则它将启动主应用程序

console.log(db); //undefined
当然,这里没有定义,这是正确的行为

请参阅,发生了什么:您正在执行请求,并提交一个处理该请求的处理程序(onsuccess)。初始化正在处理程序体中进行,但事件尚未发生!代码流进入console.log(db);行,但由于尚未调用处理程序,数据库并没有初始化

一旦onsuccess发生,就会调用处理程序并初始化db。只有在那之后你才能使用它

当然,这里没有定义,这是正确的行为

请参阅,发生了什么:您正在执行请求,并提交一个处理该请求的处理程序(onsuccess)。初始化正在处理程序体中进行,但事件尚未发生!代码流进入console.log(db);行,但由于尚未调用处理程序,数据库并没有初始化


一旦onsuccess发生,就会调用处理程序并初始化db。只有在这之后,您才能使用它。

如何检查处理程序是否执行了该函数?我们是否可以进行等待循环以进一步执行?如果调用start\u main\u application(),我们可能不需要计时器函数从处理程序本身调用函数。我不能进行同步调用吗?我得到了同步调用API引用如何检查处理程序是否执行了该函数?我们可以进行等待循环以进一步执行吗?如果我从处理程序本身调用start\u main\u application()函数,我们可能不需要计时器函数。我不能进行同步调用吗?我得到了同步调用API引用