如何等待回调函数返回?

问题描述:

我正在使用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方法返回前完成执行。

不要试图打破异步:你的应用程序可能会最终看起来对用户没有反应。对于之后必须执行的任何代码,使用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

你不必等待......只写你的代码中querySuccess事后执行它....

我写来解决类似的问题的功能,你可以这样调用:

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); 
     } 
}