2012-04-08 215 views
3

我正在使用phonegap製作android應用程序。我正在使用phonegap的存儲API來查詢數據庫。這裏是我的代碼:如何等待回調函數返回?

function directPath(src, dest) 
{ 
    var db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000); 
    db.transaction(queryDB, errorCB); 
    return arrayroute; 
} 

function queryDB(tx) 
{ 
    tx.executeSql(query, [], querySuccess, errorCB); 
} 

function querySuccess(tx,results) { 
    //Write some code here. 
} 

function errorCB(err) { 
    alert("Error in SQL: " + err); 
} 

問題是我想等到回調方法querySuccess在從directPath方法返回前完成執行。

回答

5

不要試圖打破異步:你的應用程序可能會最終看起來對用戶沒有反應。對於之後必須執行的任何代碼,使用querySuccess回調。

+0

我打電話directPath()多次,每次我想執行不同的代碼。那麼,我該如何解決這個問題呢? – coders1290 2012-04-09 10:09:39

+0

你可以給directPath提供一個不同的函數指針作爲第三個參數: directPath(src,dest,func) 和func將作爲你的查詢的成功回調傳遞 – allesmi 2012-04-09 12:09:13

+0

得到它。謝謝。 – coders1290 2012-04-10 08:14:34

0

你不必等待......只寫你的代碼中querySuccess事後執行它....

3

我寫來解決類似的問題的功能,你可以這樣調用:

database("SELECT * FROM USER", function(result){ 
    console.log(result); 
}); 

//FUNCTION 
function database(sql, callback) { 

    if(!callback) { callback = function(r) { console.log(r); } } 

    var database_name = "Database", 
     database_version = "1.0", 
     database_displayname = "DatabaseName", 
     database_size = 1000000, 
     result = { 
      error: -1, 
      message: "", 
      len: 0, 
      rows: {} 
     }, 
     db = window.openDatabase(database_name, database_version, database_displayname, database_size); 
     db.transaction(
         function (tx) { 
          tx.executeSql(sql, [], querySuccess, errorCB); 
         }, function (tx, results) { 
          //SUCCESS 
         }, function (err) { 
          //ERROR 
         } 
     ); 
     function querySuccess(tx, results) { 
      if (results) { 
       result.len = results.rows.length; 
       result.message = "Success"; 
       for (var i=0; i<result.len; i++){ 
        result.rows[i] = results.rows.item(i); 
       } 
      } else { 
       result.len = 0; 
      } 
      callback(result); 
     } 
     function errorCB(err) { 
      result.error = err.code; 
      result.message = err.message; 
      callback(result); 
     } 
}