2011-10-19 12 views
6

Estoy intentando llamar a una función que SELECCIONE los valores de mi base de datos Web SQL. Me gustaría devolver los valores SELECTED en una variable dentro de la función principal. Pero, la variable siempre regresa en blanco, si es global o no.Web SQL SELECCIONE el valor de retorno de la transacción

Como podrá ver el console.log dentro de la función selectRow registra los valores correctos de la consulta de la base de datos, pero console.log aparece en blanco en la función initDB.

También he notado que el registro en blanco aparece antes del registro dentro de la función selectRow. Encontré foros donde las personas hablan de que las transacciones de la base de datos son asincrónicas. Entiendo que esta es la razón por la cual mi variable que se devuelve está en blanco. Sin embargo, después de golpear mi cabeza contra la pared muchas veces todavía no puedo encontrar una manera de evitar este problema asincrónico.

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

Respuesta

17

Usted puede cambiar su función selectRow() a aceptar una devolución de llamada como parámetro, que se llamará con el resultado en lugar de devolver el resultado:

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

Muchas gracias. Las retrollamadas son un nuevo concepto para mí, pero me aseguraré de aprender más sobre ellas. –

+1

Las devoluciones de llamada son el concepto más difícil de acostumbrarse al comenzar con javascript – drinovc

3

Esto es complicado porque tiene una respuesta tardía hay que esperar la respuesta de SQL antes de datos de retorno, es por eso que necesita para pasar una llamada de retorno

0

Ver el sitio: groups.google.com/forum/?fromgroups#!topic/phonegap/YCRt2Hdu ckg

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

}

relacionada con el código HTML siguiente:

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

con la tabla: Une

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 +

Cuestiones relacionadas