HTML5数据库API:同步请求

时间:2010-10-29 13:50:33

标签: javascript database html5

我目前在html5 iphone webapp上使用客户端数据库。 在我的代码中,我需要检查本地数据库中是否存在行:

function isStarted(oDB) {
 var ret = null;
 oDB.query(sql,params,function(transaction,result) {
    if(result.rows.length > 0 ) {
        ret = true;
    } else {
        ret = false;
    }
 });

return ret;

}

不幸的是,isStarted()的返回发生在回调函数之前,我总是得到一个“null”值。 在W3c spec我们可以看到“synchronous-database-api”,但我该如何使用它? 是否有一个技巧可以通过asynchronus requets获得良好的“ret”值?

感谢您的帮助

3 个答案:

答案 0 :(得分:8)

要获得实施DatabaseSync的对象,您必须致电openDatabaseSync(...)而不是openDatabase(...)。我不知道iPhone,或者你所拥有的oDB对象是什么,但根据规范你只能在WebWorker中获得openDatabaseSync方法,而不是普通的网络浏览器{{1} }。当然window已经证明UI线程中潜在长度的同步操作不是一个好主意。

无法同步运行异步代码,反之亦然。为此,您需要语言级功能,如JavaScript没有的线程或协同例程。您必须退出函数并将控制权返回给浏览器,以允许它执行HTTP请求或数据库查询,并回调您给出的处理函数。

因此,每次执行涉及数据库IO的操作时,您都必须重写代码“由内而外”来传递回调函数,而不是期望返回值。

XMLHttpRequest

答案 1 :(得分:8)

我是唯一一个发现这个异步请求荒谬的人吗? 更重要的是,Safari现在似乎只实现了异步模型......我想知道我们如何有效地编写代码......

我喜欢使用异步数据库驱动程序进行严格编程的任何链接。

答案 2 :(得分:-1)

当您打算同步检索结果时,您必须阻止下一次执行。您必须付出的代价是在执行期间UI被阻止。

var ret = null;
var finished = false;

cfunction isStarted(oDB) {
         oDB.query(sql,params,function(transaction,result) {
                ret = result;
                finished = true;
         });

    while(!finished){
    ;//block next execution, while result is being fetched
    }
    return ret;
}