javascript:如何保持事务(WebSql)活着

时间:2013-05-05 13:13:57

标签: javascript transactions web-worker

我有一个Worker,我想在其中执行我的SQL查询。但是,这是我的问题,我希望所有这些查询都在同一个事务中执行。这就是我现在拥有(不工作)工人的方式:

db = openDatabase("WorkerFoo", "", "", 1);

if (db) {
    db.transaction(function (tx) {
        self.onmessage = function(e) {
            tx.executeSql(e.data, [],  function(tx, rs){
                    self.postMessage(rs.rows.item(0)) ;
            }) ;
        };
    }) ;
}
else {
    self.postMessage('No WebSql support in Worker') ;
}

然而,这样做,没有任何反应(没有错误)。有任何建议如何解决这个问题?

我遇到的另一个(相关)问题是,如果查询阻塞了UI线程,因为查询很重并需要几秒钟,那么在Worker中执行查询会解决这个问题吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

回答你的问题:

  • 查询不应该阻止UI线程,即使没有在web-worker中执行,因为它是异步的(假设目标计算机具有足够的多线程功能)。 JavaScript在非阻塞异步IO上蓬勃发展。

  • 例如,您可以将SQL代码本身传递给worker,并拥有transactionStarttransactionEnd消息,并且只在收到transactionEnd后执行代码。

注意,WebSQL规范是no longer under work

您可能想要考虑IndexedDB,它的方法也会在不阻塞调用线程的情况下返回。 (同样,不需要网络工作者,但是如果您想要与WebWorkers一起使用,它会有一个同步版本(但我认为还没有实现))。

祝你好运!