2010-07-08 74 views
0

我使用的是HTML5 Web數據庫API和我有檢查,看看是否應用程序需要去執行它的功能是建立階段:如何設置與HTML5的Web數據庫API狀態

this.setupRequired = function() { 
    var status; 
    try { 
     this.db.transaction(function(tx) { 
      tx.executeSql("SELECT * FROM settings", [], function (tx,result) { 
       if (result.rows.length == 0) { 
        status = true; 
       } else { 
        status = false; 
       } 
      }, function(tx) { 
       status = true; 
      }) 
     }); 
    } catch (e) { 
     return true; 
    } 
    return status 
} 

我要根據設置表中是否有數據(或者設置表不存在)來返回true或false。狀態var沒有設置,我猜這是由於範圍問題和匿名回調函數。我很確定我需要在這裏使用閉包來糾正問題,但不能完全正確。

回答

0

我想返回true或基於是否有在設置表或數據不

你可以不假。在setupRequired()方法不得不返回時,不知道設置表中是否有數據。只有當SQL數據庫執行查詢並調用回調函數時纔會知道這一點。只有在setupRequired()之後纔會發生這種情況,導致它被調用的函數全部退出,並將控制權返回給瀏覽器。

這就是傳遞給executeSql()的回調函數的要點。該功能不會馬上執行,因此在達到return status時,status將不會被觸碰。更重要的是,回調函數中發生的任何異常都不會導致catch(e)塊被執行,因爲try...catch塊在其內部定義的函數實際被調用時將會退出。所以這try...catch是無效的。

這是'異步'編碼。僅僅因爲某些代碼在函數之下,並不意味着該函數將首先執行。

+0

這非常合理,謝謝。 – rjlee 2010-07-08 10:00:09

0

嗯,我沒有任何使用此API的經驗,但它似乎嘗試在回調函數中設置一個值,然後從外部函數返回該值。假設回調是異步的,這是行不通的。我認爲最好的辦法是給你的代碼更改爲類似:

this.setupRequired = function() { 
    try { 
     this.db.transaction(function(tx) { 
      tx.executeSql("SELECT * FROM settings", [], function (tx,result) { 
       if (result.rows.length == 0) { 
        doYourSetupFunction(); 
       } else { 
        //don't; 
       } 
      }, function(tx) { 
       doYourSetupFunction(); 
      }) 
     }); 
    } catch (e) { 
     doYourSetupFunction(); 
    } 
} 

從而使setupRequired功能是承擔一切檢查和觸發設置。

+0

謝謝,這就是我原來的想法,並試圖擺脫,但正如你所說回調的異步性質意味着它是不可能的,所以我必須回到那個。 – rjlee 2010-07-08 09:59:19

+0

沒問題:)可能有更好的解決方案,但我們需要更多地瞭解其他代碼。祝你好運! – Jake 2010-07-08 10:16:20

0

您可以將狀態設置爲對象的屬性或您自己製作的另一個對象。

你也可以在每個階段檢查'this'是什麼或使用螢火蟲的值狀態。