1

SQLクエリを実行したいWorkerがあります。しかし、それが私の問題です。これらすべてのクエリを同じトランザクション内で実行したいのです。これは、現在(動作していない)ワーカーを持っている方法です:

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') ;
}

ただし、この方法では何も起こりません (エラーは発生しません)。これを修正する方法はありますか?

もう 1 つの (関連する) 質問は、クエリが重くて数秒かかるため、クエリが UI スレッドをブロックしている場合、Worker 内でクエリを実行するとこの問題は解決しますか?

どうもありがとう!

4

1 に答える 1

1

質問に答えるには:

  • Web ワーカーで実行されていない場合でも、クエリは非同期であるため、UI スレッドをブロックするべきではありません (ターゲット コンピューターに十分なマルチスレッド機能があると仮定します)。JavaScript は、ノンブロッキングの非同期 IO で成功します。

  • たとえば、SQL コード自体をワーカーに渡し、transactionStarttransactionEndメッセージを保持し、transactionEnd.

WebSQL の仕様は現在作業中ではないことに注意してください。

IndexedDBを検討することもできます。そのメソッドも、呼び出し元のスレッドをブロックせずに戻ります。(繰り返しますが、Web Worker は必要ありませんが、必要に応じて WebWorkers で使用できる同期バージョンがあります (ただし、まだ誰も実装していないと思います))。

幸運を!

于 2013-05-06T07:19:17.020 に答える