2013-05-05 64 views
1

我有,我要執行我的SQL查詢一個工人。但是,那是我的問題,我希望所有這些查詢都在同一個事務中執行。這是我現在的工作方式:的javascript:如何保持一個事務(的WebSQL)活着

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線程,因爲查詢很重,需要幾秒鐘,將查詢的工人中的執行解決這個問題?

非常感謝!

回答

1

回答您的問題:

  • 查詢應不會阻塞UI線程,即使在網絡工作者不執行,因爲它是異步(假設目標計算機有足夠多線程權力是)。 JavaScript在非阻塞異步IO上蓬勃發展。

  • 可以,例如,SQL代碼本身傳遞給工人,並有transactionStarttransactionEnd消息,只接收一個transactionEnd後執行代碼。

請注意,WebSQL規範是no longer under work

你可能要考慮IndexedDB,其方法也返回而不阻塞調用線程。 (同樣,不需要網絡工作者,但它確實有一個同步的版本,如果你願意,你可以用WebWorkers使用(但我認爲沒有人implementes還))。

祝你好運!

+0

我建立了iPad上的PhoneGap應用程序。而我想要做的是,對於搜索字段,在打字時填寫結果列表。因爲查詢是沉重的,它需要1或2秒才能完成,在此期間鍵盤凍結,使流暢的打字是不可能的! – 2013-05-06 09:11:10

+0

@JeanlucaScaljeri哦,我明白你想要做什麼,IIRC indexeddb在iOS中不被支持,你可能想嘗試這個polyfill:http://nparashuram.com/IndexedDBShim/除此之外,我說的應該工作 – 2013-05-06 09:13:18

+0

好的,我想我找到了問題。我正在使用[this](https://github.com/brodyspark/PhoneGap-sqlitePlugin-iOS)SQLite插件,該插件指出API將阻止應用程序執行(請參閱「已知限制」)。多好:( – 2013-05-06 13:09:59