首先我知道WebKit不允许对SQLite数据库进行同步请求。我开始玩它并尝试将结果分配给全局变量“data”。我仍然不确定是否可能,但想问你。
我创建了全局对象来存储来自DB的响应
var data = {};
这是DB class
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()调用后立即使用“数据”进行操作,但是如果我在事务之后生成alert(),那么数据将填充所有信息。
任何想法如何避免它?
答案 0 :(得分:3)
我会假设您正在进行异步 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()
使其工作的原因是,暂停使响应有机会在其他警报运行之前返回。
答案 1 :(得分:1)
问题是,如果在调用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);
});