1

我有一个 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 中执行查询会解决这个问题吗?

非常感谢!

4

1 回答 1

1

要回答您的问题:

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

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

注意,WebSQL 规范不再工作

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

祝你好运!

于 2013-05-06T07:19:17.020 回答