0

こんにちは、データベースで収集された値を返すためにjavascript関数を使用しているPhonegapプログラムを作成しています。問題は、値が再帰関数にあるため、値を返すことができないことです。

コードは次のとおりです。

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は、データベース アクションが終了したときに実行されますが、メイン関数の残りの部分はおそらく最初に実行されます。したがって、コールバックを使用する必要があります。

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 に答える