[英]WebSQL and Javascript Order of Operation
我的應用程序使用的是javascript webSQL,並且命令執行順序出現問題。 無論我的代碼在查詢中的順序如何,都將最后執行。 例如,在以下代碼2中,將在1之前發出警報:
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;
任何想法為什么會發生這種情況?
當您發出alert(“ 2”)時,您尚未完成交易,因此傳遞給它的第二個函數沒有被調用。 由於它是我假設的success
處理程序,因此將在事務成功完成后調用它。 第三個參數將是查詢失敗時(僅在查詢失敗時)執行的代碼段。
當頁面加載了足以執行javascript的內容時,將執行事件處理程序代碼之外的所有內容。 請注意,整個頁面無需加載即可執行alert("2")
,僅夠使用JS。 由於這些語句彼此靠近,因此在到達並執行alert(“ 2”)語句之前,交易完成的可能性基本上為0。
但是,如果您在alert("2")
和db.transaction(...)之間有足夠的代碼,則可能(在所謂的競態條件下 )可以在alert(2)代碼之前執行回調。
在這種情況下,您要小心事件處理程序,盡管這取決於成功處理程序的工作方式。 如果它修改了頁面DOM,那么我強烈建議將db.transaction()和周圍的代碼包裝在綁定到頁面加載的事件處理程序中。
這不是您問題的答案,但我想我應該給您關於webSQL的警告。
截至2010年11月18日,W3C已宣布他們已棄用Web SQL數據庫建議草案,並將不再維護它。
因此,盡管目前它可以在瀏覽器中運行,但將來我將不再依賴它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.