【问题标题】:Closures and callbacks闭包和回调
【发布时间】:2012-12-08 04:38:48
【问题描述】:

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

我认为我遗漏了一些明显的东西。

谢谢

安东尼

【问题讨论】:

  • 如果我的理解正确,您应该将 console.log 调用放在回调中(在 resultout.push 下方)。
  • 您能具体描述一下您的问题是什么吗?这段代码到底应该做什么,而它又做了什么?
  • 简短的回答是不要fetchAll返回一个值。相反,让fetchAll 接受在getResults 的回调中调用的回调。当函数依赖于异步方法来获取该值时,您不能让函数同步返回该值。

标签: javascript callback closures opendatabase


【解决方案1】:

如果我对您的问题的理解正确,请查看您需要的结果

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

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

【讨论】:

  • 哇 - 感谢您的回复。我要做的基本上是让 fetchAll 从数据库中返回一个行/字段对象。如果有更好的方法 - 请说。
  • 在我看来,这看起来不错,您只需要注意函数的异步性质。
【解决方案2】:

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

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

您有多种选择:

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

    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,您可以使用 https://github.com/laverdet/node-fibershttp://github.com/maxtaco/tamejs 将异步样式转换为同步样式(我目前正在使用 tamejs 来实现此目的,这很棒!)
  • 还有其他我不太了解的话题

【讨论】:

    猜你喜欢
    • 2016-04-06
    • 2015-05-22
    • 2011-01-05
    • 2013-01-18
    • 2015-07-02
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多