Возвращаемое значение транзакции Web SQL SELECT - PullRequest
6 голосов
/ 19 октября 2011

Я пытаюсь вызвать функцию, которая выбирает значения из моей базы данных Web SQL. Я хотел бы вернуть значения SELECTED в переменную внутри родительской функции. Но переменная всегда возвращает пустое значение, независимо от того, глобально оно или нет.

Поскольку вы сможете увидеть console.log внутри функции selectRow, она записывает правильные значения из запроса к базе данных, но 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 ]

17 голосов
/ 19 октября 2011

Вы можете изменить функцию 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);
   });
} 
3 голосов
/ 12 сентября 2012

это сложно, потому что у вас есть отложенный ответ, вам нужно дождаться ответа SQL, прежде чем возвращать данные, поэтому необходимо передать функцию обратного вызова

0 голосов
/ 18 мая 2013

См. Сайт: 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 +

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...