HTML5数据库API:同步请求

7

我目前在一个HTML5 iPhone Web应用程序中使用客户端数据库。 在我的代码中,我需要检查本地DB是否存在一行:

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规范中,我们可以看到一个"synchronous-database-api",但我该怎么使用它呢? 有没有什么技巧可以通过异步请求获得正确的"ret"值?

感谢您的帮助。


我喜欢这个问题。它非常清楚地陈述了问题。 - Phillip Senn
3个回答

8
要获取实现DatabaseSync的对象,您需要调用openDatabaseSync(...)而不是openDatabase(...)。我不了解iPhone或者您拥有的oDB对象,但根据规范,您只能在WebWorker中获取openDatabaseSync方法,而不能在普通的Web浏览器window中获取。当然,XMLHttpRequest已经证明,在UI线程中进行潜在的长时间同步操作并不是一个好主意。
无法将异步代码同步运行,反之亦然。要这样做,您需要像JavaScript没有的线程或协程这样的语言级特性。您必须退出函数并将控制权返回给浏览器,以允许它执行HTTP请求或数据库查询,并在您提供的处理程序函数上回调您。
因此,每次涉及数据库IO时,您都必须“从内到外”重写代码,传递回调函数而不是期望返回值。
function tellMeWhenIsStarted(oDB, callback) {
    oDB.query(sql,params,function(transaction,result) {
        callback(result.rows.length>0);
    }
});

你是在返回回调函数还是在调用它? - Phillip Senn

8

我是唯一一个觉得这个异步请求很荒谬吗?此外,似乎Safari现在只实现了异步模型...我想知道我们如何高效地编写代码...

我希望能够获取任何有关使用异步数据库驱动程序的严肃编程链接。


-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;
}

1
这似乎在Chromium 17.0.963.56中无法工作。这也是我所期望的,因为JS实际上没有线程,因此在while循环期间不仅UI被阻塞,而且实际的获取也被阻塞了。 - keppla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接