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

非同期リクエストから同期リクエストに移行しようとしていると思います

良いトピックです。ウェブ上でこれに対処する多くの投稿と解決策を見つけることができます

いくつかのオプションがあります:

  • 関数で return の代わりに callback を使用する: 関数は別のパラメーター (コールバック) を受け取り、そのコールバックを呼び出して、戻りたい値を渡す必要があります。

    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。多くの場合、そのための関数が 1 つありgetResultsSyncます。

  • ノードを使用すると、 https://github.com/laverdet/node-fibersまたはhttp://github.com/maxtaco/tamejsを使用して、非同期スタイルから同期スタイルに変換できます (現在、その目的で tamejs を使用していますが、すごい!)
  • そして、私が話すのに十分なほど知らない他の人たち
于 2012-12-20T16:24:36.470 に答える