2010-10-29 51 views
7

我目前在html5 iphone webapp上使用客戶端數據庫。 在我的代碼我需要檢查行是否存在於本地數據庫:回調函數之前發生HTML5數據庫API:同步請求

function isStarted(oDB) { 
var ret = null; 
oDB.query(sql,params,function(transaction,result) { 
    if(result.rows.length > 0) { 
     ret = true; 
    } else { 
     ret = false; 
    } 
}); 

return ret; 

}

不幸的是isStarted(返回),我總是得到一個「空」值。 在W3c spec中,我們可以看到「同步數據庫api」,但我該如何使用它? 有沒有一種方法可以通過異步請求獲得良好的「ret」值?

感謝您的幫助

+0

我喜歡這個問題。它很好地說明了這個問題。 – 2011-10-12 18:58:11

回答

8

爲了得到落實DatabaseSync你必須調用openDatabaseSync(...)而不是openDatabase(...)的對象。我不知道iPhone,或者你所擁有的東西是什麼,但根據規範,你只能在WebWorker中獲得openDatabaseSync方法,而不能在普通Web瀏覽器window中獲得。當然,XMLHttpRequest已經證明在UI線程中可能長度的同步操作不是一個好主意。

無法同步運行異步代碼,反之亦然。要做到這一點,您需要JavaScript等不具備的線程或協同例程等語言級功能。您必須退出函數並將控制權返回給瀏覽器,以允許其執行HTTP請求或數據庫查詢,並將回調函數返回給您的處理程序函數。

因此,每次執行涉及數據庫IO的操作時,您都必須重新編寫內部代碼以傳遞迴調函數,而不是期望返回值。

function tellMeWhenIsStarted(oDB, callback) { 
    oDB.query(sql,params,function(transaction,result) { 
     callback(result.rows.length>0); 
    } 
}); 
+0

你正在回撥回叫,還是打電話? – 2011-10-12 19:00:08

+0

你在呼喚它。 – 2012-03-09 21:21:15

8

我是唯一一個發現這個異步請求可笑的人嗎? 更重要的是,Safari似乎現在只實現異步模型...我不知道我們如何有效地編寫代碼...

我會喜歡任何鏈接到異步db驅動程序認真編程。

-1

當您打算同步檢索結果時,您必須阻止下一次執行。您必須付出的代價是UI在執行期間被阻止。

var ret = null; 
var finished = false; 

cfunction isStarted(oDB) { 
     oDB.query(sql,params,function(transaction,result) { 
       ret = result; 
       finished = true; 
     }); 

    while(!finished){ 
    ;//block next execution, while result is being fetched 
    } 
    return ret; 
} 
+1

這似乎不起作用,至少在Chromium 17.0.963.56中。這也是我所期望的,因爲JS沒有真正的線程,所以,不僅UI在while循環期間被阻塞,而且實際獲取也是如此。 – keppla 2012-03-07 19:38:39