为JavaScript变量赋值时出现问题
我正在Firefox 5.0中尝试以下内容:为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
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引用