2011-10-19 7 views
6

私のWeb SQLデータベースからSELECTSの値を取得しようとしています。 SELECTED値を親関数内の変数に戻したいと思います。しかし、変数は常に空白を返し、グローバルであるかどうかを判断します。Web SQL SELECTトランザクションの戻り値

selectRow関数内でconsole.logが表示されるので、データベースクエリから正しい値がログに記録されますが、console.logはinitDB関数に空白で表示されます。

また、selectRow関数内のログの前に空白のログが表示されることに気付きました。私は、人々が非同期のデータベーストランザクションについて話しているフォーラムを見つけました。私はこれが私の変数が返されている理由が空であることを理解します。しかし、何度も壁に頭を打つと、私はまだこの非同期問題を回避する方法を見つけることができません。あなたは応答遅れを持っているので、

/** Initialize Database **/ 
function initDB(){ 
    createTable(); 
    selectRow("SELECT * FROM planets;", function(pleaseWork) { 
    console.log(pleaseWork); 
    // any further processing here 
    }); 
} 

/** Select Row from Table **/ 
function selectRow(query, callBack){ // <-- extra param 
    var result = []; 
    db.transaction(function (tx) { 
     tx.executeSql(query, [], function(tx, rs){ 
     for(var i=0; i<rs.rows.length; i++) { 
      var row = rs.rows.item(i) 
      result[i] = { id: row['id'], 
          name: row['name'] 
      } 
     } 
     console.log(result); 
     callBack(result); // <-- new bit here 
     }, errorHandler); 
    }); 
} 

答えて

17

は、あなたはそれが結果を返すのではなく、結果を呼び出しますパラメータとしてコールバックを受け入れるようにselectRow()機能を変更することができますgroups.google.com/forum/?fromgroups#!topic/phonegap/YCRt2Hdu: あなたはサイトを参照してください。コールバック関数に

+1

ありがとうございました。コールバックは私のための新しいコンセプトですが、私はそれらについてもっと知っています。 –

+1

コールバックは、javascriptで始まるときに慣れるのが最も難しい概念です – drinovc

3

これはトリッキーです:

/** Initialize Database **/ 
function initDB(){ 
    createTable(); 
    var pleaseWork = selectRow("SELECT * FROM planets;"); 
    console.log(pleaseWork); 
} 

/** Select Row from Table **/ 
function selectRow(query){ 
    var result = []; 

    db.transaction(function (tx) { 
    tx.executeSql(query, [], function(tx, rs){ 
     for(var i=0; i<rs.rows.length; i++) { 
     var row = rs.rows.item(i) 
     result[i] = { 
      id: row['id'], 
      name: row['name'] 
     } 
     } 
     console.log(result); 
    }, errorHandler); 
    }); 

    return result; 
} 
0

に合格する必要がある理由の戻り値のデータの前にSQL応答、 を待つ必要がありますCKG

次のHTMLに関連
function loadUniteSelectListe() { 
db.transaction(function (tx) { 
//populate drop down for unites 
    tx.executeSql('SELECT * FROM Unites', [], function (tx, results) { 
     var len = results.rows.length; 
     var i=0; 
     var txt=""; 
     for (i = 0; i < len; i++){ 
      txt=txt + "<option value="+results.rows.item(i).uniteName + ">" + results.rows.item(i).uniteSymbol + "</option>"; 
     } 
     document.getElementById("filtreUniteSelect").innerHTML=txt; 
    }, null); 
    }); 

}

:テーブルと

Unité: <select name="filtreUniteSelect" id="filtreUniteSelect" ></select><br/> 

は:結びつける

CREATE TABLE IF NOT EXISTS Unites (uniteID INTEGER PRIMARY KEY AUTOINCREMENT, uniteName TEXT, uniteSymbol TEXT) 
    tx.executeSql("INSERT INTO Unites(uniteName,uniteSymbol) VALUES(?, ?)", ['heure', 'h']); //fonctionnel un à la fois 
    tx.executeSql("INSERT INTO Unites(uniteName,uniteSymbol) VALUES(?, ?)", ['kilometre', 'km']); //fonctionnel un à la fois 
    tx.executeSql("INSERT INTO Unites(uniteName,uniteSymbol) VALUES(?, ?)", ['dollar', '$']); //fonctionnel un à la fois 

A +