同步模式下的WebSQL ......有可能吗?

时间:2011-05-26 16:04:01

标签: javascript html5

我已经开始使用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...

现在,由于查询是异步的,解释器在获得结果之前开始执行其余的代码,当然它不起作用。

有同步运行查询的技巧,还是使用回调函数来解决这个问题的一些技巧?

先谢谢你,伙计们:)

2 个答案:

答案 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方面大大简化了代码。