闭包和回调

时间:2012-12-20 15:56:40

标签: 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,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;  
}

我想我错过了一些明显的东西。

由于

安东尼

2 个答案:

答案 0 :(得分:0)

如果我正确理解你的问题,要查看结果,你需要这个

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

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

答案 1 :(得分:0)

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

这是一个很好的主题,您可以在网上找到许多解决此问题的帖子和解决方案

您有几种选择:

  • 使用回调代替返回您的函数: 您的函数必须接收另一个参数(回调)并调用该回调 传递给你想要返回的值

    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

  • 使用节点,您可以使用https://github.com/laverdet/node-fibershttp://github.com/maxtaco/tamejs将异步转换为同步样式(我目前正在为此目的使用tamejs,这很棒!)
  • 和其他人我不太了解