我有一个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中执行查询会解决这个问题吗?
非常感谢!
答案 0 :(得分:1)
回答你的问题:
查询不应该阻止UI线程,即使没有在web-worker中执行,因为它是异步的(假设目标计算机具有足够的多线程功能)。 JavaScript在非阻塞异步IO上蓬勃发展。
例如,您可以将SQL代码本身传递给worker,并拥有transactionStart
和transactionEnd
消息,并且只在收到transactionEnd
后执行代码。
注意,WebSQL规范是no longer under work。
您可能想要考虑IndexedDB,它的方法也会在不阻塞调用线程的情况下返回。 (同样,不需要网络工作者,但是如果您想要与WebWorkers一起使用,它会有一个同步版本(但我认为还没有实现))。
祝你好运!