我已经开始使用HTML5和WebSQL了,我很快遇到了一个问题:所有的DB调用都是异步的。 我来自PHP编程,所有的调用都是同步的,而且我对asynch的东西感到茫然。
基本上,我打开数据库并运行一个查询,它使用我通过GET传递给页面的id参数(即http://myserver.com/mypage.html?id=123)。我需要globalResult中的结果:
id=window.location.search.substring(1).split('=')[1];
db=openDatabase("testDB", "1.0", "Test Database", 10000000);
db.transaction(function(tx)
{
tx.executeSql("SELECT * FROM testTable WHERE id="+id,[],successCB,errorCB);
});
function errorCB(tx,err)
{
alert("Error processing SQL: "+err);
}
function successCB(tx,result)
{
globalResult=result.rows.item(0)['description'];
}
...Javascript code which needs globalResult to be set...
现在,由于查询是异步的,解释器在获得结果之前开始执行其余的代码,当然它不起作用。
有同步运行查询的技巧,还是使用回调函数来解决这个问题的一些技巧?
先谢谢你,伙计们:)
答案 0 :(得分:0)
我实际上从未遇到过与您相同的问题,我的WebSQL实现示例:
var projectName = {};
projectName.webdb = {};
projectName.webdb.db = null;
projectName.webdb.open = function() {
projectName.webdb.db = openDatabase('Database Name', '1.0', 'description', 10 * 1024 * 1024);
}
projectName.webdb.onError = function(tx, e) {alert('Database Error: ' + e.message );}
projectName.webdb.onSuccess = function(tx, r) {}
projectName.webdb.getPeopleForExample = function() {
projectName.webdb.db.transaction(function(tx) {
tx.executeSql('SELECT * FROM people WHERE id=23', [], loadPeople, projectName.webdb.onError);
});
}
function loadPeople(tx, rs) {
for (var i=0; i < rs.rows.length; i++) {
var name = rs.rows.item(i).name;
var email = rs.rows.item(i).email;
// now you do whatever you want with the data..
}
}
然后从程序代码的任何地方我都称之为
projectName.webdb.getPeopleForExample();
我想你会从代码示例中得到这个想法:)
答案 1 :(得分:0)
最后,我发现最简单的解决方案是改变Javascript的流程。 我没有等待结果填充我的页面(类似于PHP),而是选择了一个空白结构,最后由“成功”回调函数填充。
另外,我建议使用jquery-sql,它在WebSQL方面大大简化了代码。