0

嗨,伙计们,我正在创建一个 Phonegap 程序,该程序使用 javascript 函数返回数据库中收集的值,问题是我无法返回这些值,因为它们在递归函数中,每次调用主函数时它都不会返回任何内容

代码是:

function exporta_imoveis(){
  var db = window.openDatabase("Ithomes", "1.0", "Cordova Demo", 200000);
  db.transaction(function coletandovisitas(tx){
    alert('Coletando imoveis no BD local ');
    tx.executeSql('SELECT * FROM IMOVEIS', [], function percorrendolinhas(tx, results){
      var len = results.rows.length;
      var array_retorno = new Array();
      for (var i=0; i<len; i++){
        array_retorno[i] = results.rows.item(i);
      }
      return array_retorno;
    }, function err(){ alert('erro ao coletar') } );            
  },function erro(){ alert('erro ao coletar dados dos imoveis') }, function acerto(){ alert('Dados dos imoveis coletadas com sucesso')} );
}

我需要获取array_retorno变量的值,请帮忙

4

3 回答 3

2

您遇到的问题与递归无关,而是与异步函数有关。percorrendolinhas您传递给的函数executeSql将在您的数据库操作完成时执行,但您的 mainfunction 的其余部分可能会首先执行。因此,您应该使用回调:

function exporta_imoveis(callback){
  var db = window.openDatabase("Ithomes", "1.0", "Cordova Demo", 200000);
  db.transaction(function coletandovisitas(tx){
  alert('Coletando imoveis no BD local ');
  tx.executeSql('SELECT * FROM IMOVEIS', [], function percorrendolinhas(tx, results){
    var len = results.rows.length;
    var array_retorno = new Array();
    for (var i=0; i<len; i++){
      array_retorno[i] = results.rows.item(i);
    }
    callback(array_retorno);
  }, function err(){ alert('erro ao coletar') } );            
  },function erro(){ alert('erro ao coletar dados dos imoveis') }, function acerto(){ alert('Dados dos imoveis coletadas com sucesso')} );
}    

您现在可以通过以下方式调用您的函数:

exporta_imoveis(function (array_retorno) {
   //do something with array_retorno
});
于 2013-05-15T15:48:46.930 回答
1

我对名称和您要实现的目标感到有些困惑,但是如果您按如下方式传递回调:

function exporta_imoveis(callback){
  var db = window.openDatabase("Ithomes", "1.0", "Cordova Demo", 200000);
  db.transaction(function coletandovisitas(tx){
    alert('Coletando imoveis no BD local ');
    tx.executeSql('SELECT * FROM IMOVEIS', [], function percorrendolinhas(tx, results){
      var len = results.rows.length;
      var array_retorno = new Array();
      for (var i=0; i<len; i++){
        array_retorno[i] = results.rows.item(i);
      }
      callback(array_retorno);
    }, function err(){ alert('erro ao coletar') } );            
  },function erro(){ alert('erro ao coletar dados dos imoveis') }, function acerto(){ alert('Dados dos imoveis coletadas com sucesso')} );
}

然后你应该能够做到:

exporta_imoveis(function(array_retorno) {
  // here you will have array_retorno, do what you need on it
});

如果您不想传递回调函数,那么 @MBillau 是一种替代方法。

只是关于如何简化结构的指针:尝试使用在主要逻辑所在的代码部分之外定义的命名函数,如下所示:

function coletandovisitas(tx){
  alert('Coletando imoveis no BD local ');
  tx.executeSql('SELECT * FROM IMOVEIS', [], function percorrendolinhas(tx, results){
    var len = results.rows.length;
    var array_retorno = new Array();
    for (var i=0; i<len; i++){
      array_retorno[i] = results.rows.item(i);
    }
    callback(array_retorno);
}

function exporta_imoveis(callback){
  var db = window.openDatabase("Ithomes", "1.0", "Cordova Demo", 200000);
  db.transaction(coletandovisitas, function err(){ alert('erro ao coletar') } );            
  },function erro(){ alert('erro ao coletar dados dos imoveis') }, function acerto(){ alert('Dados dos imoveis coletadas com sucesso')} );
}

好像更清楚了一些。

于 2013-05-15T15:43:04.043 回答
0

我认为您可以移出var array_retorno = new Array();exporta_imovis功能。现在您无法访问数据,因为该变量仅存在于您的coletandovisitas函数范围内 - 一旦您离开此函数,该变量就会消失。

于 2013-05-15T15:42:52.933 回答