2012-07-30 128 views
1

我的應用程序使用JavaScript webSQL,並且遇到命令執行順序的問題。無論我的代碼在查詢中的最後執行順序如何。例如,在下面的代碼中,2將在1之前提醒:WebSQL和Javascript操作順序

db.transaction(
     function (transaction) { 
     transaction.executeSql(
     'SELECT * FROM contacts WHERE id = ?;', 
     [id], 
     function (transaction, result) { 
      alert("1"); 
      if (result.rows.length != 0) { 
      user = result.rows.item(0).name; 
      } else {} 
     }, 
     errorHandler); 
    }); 

alert("2"); 
message = id + '%1E' + name; 

任何想法爲什麼會發生這種情況?

+1

SQL的事務可能是異步調用,而alert(「2」)是下一個函數調用並立即運行。 – TheZ 2012-07-30 18:28:37

回答

1

你什麼時候提醒(「2」),你還沒有完成交易,所以你傳遞給它的第二個函數還沒有被調用。由於這是我假設的success處理程序,它將在事務成功完成後調用。第三個參數是查詢失敗時執行的代碼片段,僅當失敗時才執行。

事件處理程序代碼之外的任何內容都會在頁面加載足夠的內容以執行javascript時執行。請注意,整個頁面不需要加載執行alert("2"),只是足夠的JS。由於這些語句非常接近,因此在達到並執行警報(「2」)語句之前,交易完成的基本機會是0。

然而,如果你alert("2")和db.transaction(...)之間有足夠的代碼,很可能(在所謂的競態條件)回調可以在警報(2)代碼之前執行。

在這種情況下,您希望小心事件處理程序,但它取決於您的成功處理程序的功能。如果它修改頁面DOM,那麼我強烈建議將db.transaction()和周圍的代碼包裝在綁定到頁面加載的事件處理程序中。

-1

這不是你的問題的答案,但我想我應該給你一個關於webSQL的警告。

截至2010年11月18日,W3C宣佈已棄用Web SQL數據庫推薦草案,不再維護它。

所以,雖然它目前可能在瀏覽器中工作,但我不會依賴它來做未來的事情。

+0

是的,我知道這一點,但是從我的理解中,Chrome和Safari會保持它不添加任何新功能,現在對我來說會很好。一旦更多瀏覽器支持它,將很容易切換到indexedDatabase。 – ewein 2012-07-30 18:38:54

+0

webstorage怎麼樣? http://www.w3.org/TR/webstorage/ – Kasapo 2012-07-30 18:39:29