Web SQL SELECT事务返回值

时间:2011-10-19 04:22:20

标签: javascript sql html5 web

我正在尝试调用一个从Web SQL数据库中选择SELECTS值的函数。我想将SELECTED值返回到父函数内的变量。但是,变量总是返回空白,而不是全局变量。

您将能够看到selectRow函数中的console.log从数据库查询中记录正确的值,但是console.log在initDB函数中显示为空白。

我还注意到空白日志显示在selectRow函数内的日志之前。我找到了人们谈论数据库事务异步的论坛。我理解这就是我返回的变量为空的原因。然而,在我多次撞墙后,我仍然无法找到解决这个异步问题的方法。

/** 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;
}

3 个答案:

答案 0 :(得分:17)

您可以更改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);
   });
} 

答案 1 :(得分:3)

这很棘手,因为你有一个延迟的回应 你需要在返回数据之前等待SQL响应, 这就是为什么需要传递一个回调函数

答案 2 :(得分:0)

查看网站:groups.google.com/forum/?fromgroups#!topic/phonegap/YCRt2HducKg

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

}

与以下HTML相关:

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

表:Unites

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 +