代码之家  ›  专栏  ›  技术社区  ›  grunk

HTML5数据库API:同步请求

  •  7
  • grunk  · 技术社区  · 14 年前

    我目前在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”值?

    谢谢你的帮助

    3 回复  |  直到 12 年前
        1
  •  8
  •   bobince    14 年前

    获取对象实现 DatabaseSync 你得打电话 openDatabaseSync(...) 而不是 openDatabase(...) . 我不知道iPhone,或者 oDB 你拥有的对象是,但根据规范,你只得到 openDatabaseSync 方法在WebWorker中,而不是在普通Web浏览器中 window . 当然 XMLHttpRequest 已经证明,在UI线程中进行可能长度的同步操作不是一个好主意。

    不可能同步运行异步代码,反之亦然。要做到这一点,你需要语言级的特性,比如线程或者共同的例程,而JavaScript没有。您必须退出您的函数并将控件返回到浏览器,以允许它执行HTTP请求或数据库查询,并重新调用您提供的处理程序函数。

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

    function tellMeWhenIsStarted(oDB, callback) {
        oDB.query(sql,params,function(transaction,result) {
            callback(result.rows.length>0);
        }
    });
    
        2
  •  8
  •   Julien    14 年前

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

    我喜欢任何与异步数据库驱动程序认真编程的链接。

        3
  •  -1
  •   ivanceras    13 年前

    当您打算同步检索结果时,必须阻止下一次执行,您必须支付的价格是在执行期间被阻止的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;
    }