3

我正在开发一个数据库函数,需要从 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;  
}

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

谢谢

安东尼

4

2 回答 2

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

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

于 2012-12-20T16:03:02.367 回答
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,它是伟大的!)
  • 还有其他一些我不太了解的话题
于 2012-12-20T16:24:36.470 回答