Javascript全局变量问题
问题描述:
首先我知道WebKit不允许向SQLite数据库发出同步请求。我开始玩它,并试图将结果分配给全局变量“数据”。我仍然不确定是否有可能,但想问你。Javascript全局变量问题
-
我创建的全局对象来存储来自DB
var data = {};
这里回应是DB类
var db = {
mydb: false,
init: function() {
try {
if (!window.openDatabase) {
alert('not supported');
} else {
this.mydb = openDatabase('test_db', '1.0', 'Test DB', 1024*1024*5);
}
} catch(e) {
// Error handling code goes here.
if (e == INVALID_STATE_ERR) {
// Version number mismatch.
alert('Invalid database version.');
} else {
alert('Unknown error '+e+'.');
}
return;
}
},
exec: function (query, params) {
try {
this.mydb.transaction(function(transaction) {
transaction.executeSql(query, params, db.dataHandler, db.errorHandler);
});
} catch(e) {
alert(e.message);
}
},
dataHandler: function (transaction, results) {
// Handle the results
data = results.rows;
return true;
},
errorHandler: function (transaction, error) {
// returns true to rollback the transaction
alert('Code: '+error.code+'\nMessage: '+error.message);
return true;
},
}
- 最后这里的问题是:
$(function() {
db.init();
db.exec('SELECT * FROM errors;');
alert(Log.object_toString(data)); // this alert show empty object as I declared in first line
alert(Log.object_toString(data)); // this one return object with responded data from database
});
所以,问题是,我不能db.exec()调用之后对“数据”操纵,但如果我的交易后,使警报(),则数据将与所有信息填充。
任何想法如何避免它?
答
我会假设你正在进行异步 AJAX调用,所以你的alert()
在收到响应之前触发。
编辑:作为@Nick指出,这不是AJAX,但它是异步的,是一个问题。
我不知道你正在使用的API任何东西,但它看起来好像你的提醒应该是dataHandler
方法中:
dataHandler: function (transaction, results) {
// Handle the results
data = results.rows;
alert(Log.object_toString(data));
alert(Log.object_toString(data));
return true;
},
还是应该在一些其他的功能,那就是从内部呼叫dataHandler
。
dataHandler: function (transaction, results) {
// Handle the results
data = results.rows;
someFunction(data);
return true;
},
// ...
function someFunction(data) {
alert(Log.object_toString(data));
alert(Log.object_toString(data));
}
原因之间的alert()
使得它的工作,是暂停给予回应机会回到另一个警报运行之前。
答
问题是,如果您在调用exec之后立即访问数据,dataHandler回调函数尚未调用。确保您实际从查询中收到数据的唯一方法是在回调本身内处理它。对于您可以重新设计你的班级有点让exec函数实际上也采取了回调函数,将作为查询已成功执行被立即调用,如
exec: function (query, params, onSuccess /*, onFailure*/) {
try {
var onFailure = arguments[3] || function(){};
this.mydb.transaction(function(transaction) {
transaction.executeSql(query, params, onSuccess, onFailure);
});
} catch(e) {
onFailure(e);
}
}
然后,你可以打电话给你的db.exec像这样:
db.exec('SELECT * FROM erros;', null, function(rows) {
alert(Log.object_toString(rows));
}, function() {
var error = arguments[0] || {message: 'Unknown Exception'};
alert('An error occured: ' + error.message);
});
这是HTML5,没有涉及AJAX,但它是异步的:) – 2010-11-11 20:28:41
谢谢@尼克。在黑暗中是一枪。我真的必须加快HTML5的速度。 :o) – user113716 2010-11-11 20:30:11
看起来他正在使用本地数据库。这并不重要,它仍然是异步的。我认为'exec'应该接受一个回调函数参数,它传递给它的从属函数。 *编辑:* Nick击败了我:p – 2010-11-11 20:30:54