2010-10-29 70 views
7

我目前在html5 iphone webapp上使用客户端数据库。 在我的代码我需要检查行是否存在于本地数据库:回调函数之前发生HTML5数据库API:同步请求

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”值?

感谢您的帮助

+0

我喜欢这个问题。它很好地说明了这个问题。 – 2011-10-12 18:58:11

回答

8

为了得到落实DatabaseSync你必须调用openDatabaseSync(...)而不是openDatabase(...)的对象。我不知道iPhone,或者你所拥有的东西是什么,但根据规范,你只能在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); 
    } 
}); 
+0

你正在回拨回叫,还是打电话? – 2011-10-12 19:00:08

+0

你在呼唤它。 – 2012-03-09 21:21:15

8

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

我会喜欢任何链接到异步db驱动程序认真编程。

-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没有真正的线程,所以,不仅UI在while循环期间被阻塞,而且实际获取也是如此。 – keppla 2012-03-07 19:38:39