2012-09-16 26 views
5

Estoy llamando a una función con db.transaction siguiente código:¿Pasa parámetros adicionales a la función de devolución de llamada de WebSQL?

db.transaction(createSheetDB, function(){alert("Sheet creation error!")}, function(){alert("Sheet created!")}); 

El createSheetDB función es una función de devolución de llamada que se llama implícitamente por db.transaction(), que también pasa un parámetro tx. He implementado la función createSheetDB (tx) como esto:

function createSheetDB(tx) { 
var nextId = getNextId(); 
tx.executeSql("INSERT INTO SHEET(id, name, desc) VALUES("+nextId+",'"+sheetName+"','"+desc+"')", [], 
     function(){alert("Sheet row inserted!")}, 
     function(tx, err){alert("Sheet row insertion Error: "+err.message+" "+err.code)} 
);} 

Ahora el problema es los valores de SHEETNAME y la descripción sólo están disponibles en la función de llamada. ¿Cómo los paso a la función createSheetDB (tx)?

+1

Hay * muchas preguntas */respuestas para el caso genérico (utilizar un cierre que se une a las variables de país, entonces llama a la función de devolución de llamada real o definir la devolución de llamada reales funcionar en el mismo alcance léxico o ..), así que con suerte este * caso refinado * será más aplicable ... pero no uso WebSQL. –

+0

gracias @pst, actualmente estoy usando esta forma de resolver mi problema. –

Respuesta

3

Puede utilizar una técnica mediante la cual crea una nueva devolución de llamada que se cerrará sobre las variables que desee.

function doStuff(callback) { 
    var val = 43; 
    callback(val); 
} 

function myCallback(val, anotherVal) { 
    alert("val: " + val + "\nanotherVal: " + anotherVal); 
} 

(function() { 

    var anotherVal = "Whoa!", 
     anotherCallback = function(val) { 
      return myCallback(val, anotherVal); 
     }; 

    doStuff(anotherCallback); 

}());​ 
+0

Gracias @Josh, esta solución me parece más limpia que la de shaac. –

1

creación de devolución de llamada en función

function createSheetDB(sheetName, desc) { 
    return function(tx){ 
     var nextId = 1; 
     alert("INSERT INTO SHEET(id, name, desc) VALUES("+nextId+",'"+sheetName+"','"+desc+"')"); 
     /* delete above two lines and uncomment for your code 
     var nextId = getNextId(); 
     tx.executeSql("INSERT INTO SHEET(id, name, desc) VALUES("+nextId+",'"+sheetName+"','"+desc+"')", [], 
      function(){alert("Sheet row inserted!")}, 
      function(tx, err){alert("Sheet row insertion Error: "+err.message+" "+err.code)} 
     ); 
     */ 
    } 
} 

// dummy code to show as example 
db = {transaction: function(fn,lose,win){return fn(),win();}}; 

function testIt(){ 
    var sheetName = 'hello', 
     desc = 'world'; 
    db.transaction(createSheetDB(sheetName, desc), function(){alert("Sheet creation error!")}, function(){alert("Sheet created!")}); 
    // note how createSheetDB is now called with the vars you want 
} 
+0

Gracias @shhac. Esta solución se ve bien. Pero para mí, el de Josh parece más limpio. Aunque podría ser solo yo. ;) –

+0

Eso es justo. Encontraría que la forma de Josh es más difícil de seguir las variables en, en un gran trozo de código que es la razón por la que los mantengo todos juntos como una sola función. –

Cuestiones relacionadas