Javascript 闭包和回调

Javascript 闭包和回调,javascript,callback,closures,opendatabase,Javascript,Callback,Closures,Opendatabase,我正在处理一个数据库函数,需要从fetchAll返回结果,以便在代码中的其他地方使用它,但不确定如何执行: function fetchAll(sql,params,tableref){ var fields = new Array(); var resultout = new Array(); for (i in tableref){ fields.push(i); } getResults(sql,params,fields,fun

我正在处理一个数据库函数,需要从fetchAll返回结果,以便在代码中的其他地方使用它,但不确定如何执行:

function fetchAll(sql,params,tableref){
  var fields = new Array();
  var resultout = new Array();

  for (i in tableref){     
    fields.push(i);  
  }       

  getResults(sql,params,fields,function(results){
     // I WANT TO RETURN RESULTS
     resultout.push(results);       
  });          

// TO HERE SO I CAN RETURN from Fetchall
console.log(resultout);
}

function getResults(query,params,fields,callBack){
  var result = new Array(); 
  thisDB.transaction(function (tx) {
    tx.executeSql(query,params, function(tx, rs){
       for(var i=0; i<rs.rows.length; i++) {
          var row = rs.rows.item(i);
          var rowresults = new Object();

          for (x=0;x<fields.length;x++){
            rowresults[fields[x]] = row[fields[x]];      
          }

          result.push(rowresults);
       }
       callBack(result);
    });
  }); 

return result;  
}
函数fetchAll(sql、params、tableref){
变量字段=新数组();
var resultout=新数组();
对于表REF中的(i){
字段。推送(i);
}       
getResults(sql、参数、字段、函数(结果){
//我想返回结果
结果推送(结果);
});          
//到这里,这样我就可以从Fetchall回来了
console.log(resultout);
}
函数getResults(查询、参数、字段、回调){
var result=新数组();
此数据库事务(功能(tx){
tx.executeSql(查询、参数、函数(tx、rs){

对于(var i=0;i,如果我正确理解了您的问题,要查看结果,您需要这个

function fetchAll(sql,params,tableref){
    var fields = new Array();
    var resultout = new Array();

    for (i in tableref){     
        fields.push(i);  
    }       

    getResults(sql,params,fields,function(results){
        // I WANT TO RETURN RESULTS
        resultout.push(results);
        console.log(resultout);
    });
}

回调将在“之后”执行,因此在您的示例中基本上会看到一个空结果。这是因为回调的异步性质。

我认为您正在尝试从异步请求转移到同步请求

这是一个很好的话题,你可以在网上找到很多文章和解决方案

您有几个选择:

  • 在函数中使用callback而不是return: 您的函数必须接收另一个参数(回调)并调用该回调 将要返回的值传递给它

    function fetchAll (sql, params, tableref, callback) {
      var fields = new Array();
    
      for (i in tableref) {     
        fields.push(i);  
      }       
    
      getResults(sql, params, fields, function (results) {
         // I WANT TO RETURN RESULTS
         callback(results);       
      });
    }
    
    然后您可以这样记录结果:

    fetchAll(sql, params, tableref, function (results) { console.log(results); });
    
  • 查找同步版本的
    getResults
    ,通常只有一个函数, 可能是
    getResultsSync

  • 通过node,您可以使用或从异步样式转换为同步样式(我目前正在使用tamejs实现这一目的,它非常棒!)
  • 还有一些我不太了解的话题

您应该将console.log调用放在回调中(resultout.push下面),如果我理解正确的话。你能描述一下你的问题到底是什么吗?这段代码到底应该做什么,它做什么呢?简短的回答是不要让
fetchAll
返回一个值。相反,让
fetchAll
接受在
getResults
的回调中调用的回调当函数依赖异步方法获取值时,它没有同步返回值。哇-谢谢你的回答。我试图做的基本上是让fetchAll从数据库返回一个包含行/字段的对象。如果有更好的方法,请说。从我的角度看,这看起来不错,你只需要了解函数的异步性质。