【问题标题】:Web SQL SELECT transaction return valueWeb SQL SELECT 事务返回值
【发布时间】:2011-12-10 14:50:04
【问题描述】:

我正在尝试调用一个从我的 Web SQL 数据库中选择值的函数。我想将 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;
}

【问题讨论】:

    标签: javascript sql html web


    【解决方案1】:

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

    【讨论】:

    • 非常感谢。回调对我来说是一个新概念,但我一定会更多地了解它们。
    • 回调是从 javascript 开始时最难习惯的概念
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      查看网站: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/>
      

      与表:单位

      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+

      【讨论】:

        猜你喜欢
        • 2011-10-10
        • 1970-01-01
        • 1970-01-01
        • 2021-07-25
        • 2020-08-23
        • 2012-05-09
        • 2011-12-08
        • 2021-09-11
        • 1970-01-01
        相关资源
        最近更新 更多