【问题标题】:HTML5 Database API : Synchronous requestHTML5 数据库 API:同步请求
【发布时间】:2011-05-02 10:27:31
【问题描述】:

我目前在 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() 的返回发生在回调函数之前,我总是得到一个“空”值。 在W3c spec 中,我们可以看到“同步数据库API”,但我该如何使用它? 是否有使用异步请求获得良好“ret”值的技巧?

感谢您的帮助

【问题讨论】:

  • 我喜欢这个问题。它很好地说明了问题。

标签: javascript database html


【解决方案1】:

要获得实现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);
    }
});

【讨论】:

  • 你是返回回调,还是调用它?
【解决方案2】:

只有我一个人觉得这个异步请求很可笑? 此外,Safari 现在似乎只实现了异步模型......我想知道我们如何高效地编写这样的代码......

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

【讨论】:

    【解决方案3】:

    当你打算同步检索结果时,你必须阻止下一次执行,你必须付出的代价是在执行过程中 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;
    }
    

    【讨论】:

    • 这似乎不起作用,至少在 Chromium 17.0.963.56 中。这也是我所期望的,因为 JS 并没有真正的线程,所以,不仅 UI 在 while 循环期间被阻塞,而且实际的获取也是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 2015-10-07
    • 2011-06-06
    • 1970-01-01
    相关资源
    最近更新 更多