Javascript 如何在事务回调函数中传递参数

Javascript 如何在事务回调函数中传递参数,javascript,Javascript,来自这样的教程代码 function queryDB(tx) { tx.executeSql('SELECT * FROM DEMO', [], querySuccess, errorCB); } function querySuccess(tx, results) { } function errorCB(err) { alert("Error processing SQL: "+err.code); } var db = window.openDatabase("Da

来自这样的教程代码

function queryDB(tx) {
    tx.executeSql('SELECT * FROM DEMO', [], querySuccess, errorCB);
}

function querySuccess(tx, results) {

}

function errorCB(err) {
    alert("Error processing SQL: "+err.code);
}

var db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000);
db.transaction(queryDB, errorCB); 
在db.transaction中,我想将一个变量作为参数传递给queryDB函数,因此我想到的代码应该如下

db.transaction(queryDB(id), errorCB);

我如何才能真正实现这一点?或者它只是像这样工作,我的id将被传递并进入tx?

再次将其包装在函数中

var id = 'THEID';
db.transaction(function(){
  queryDB(id)
}, errorCB);
注意-这是假设您正在制作API。一些API/框架会自动插入所需的信息。比如说

//the db.transaction method
function transaction(param, callback) {
   //do code stuff
   callback(someInternalId); //callback is the function you pass as the first parameter
}

因此,如果要在回调中传递自己的数据,请将其包装在函数中。否则,您正在使用的代码可能会自动为您执行此操作

确定首先创建一个类,该类将处理您的db实例(db更新等)。该类将包含一个函数,您将使用该函数进行所有查询

self.db = window.openDatabase( // and so on
然后函数:

    // execute a query and fetches the data as an array of objects
self.executeQuery = function(string, args, callback, callbackparams) {
    var self = this;
    //console.log('db execute: '+string);
    self.db.transaction(function(tx) {
        tx.executeSql(string, args, function(tx, result) {
            var retval = [];
            for (var i = 0; i < result.rows.length; ++i) {
                retval.push(result.rows.item(i));
            }
            if (callback) {
                callback(retval, result, callbackparams);
            }

        }, self.error);
    });
}
function dbInsert(param1, param2, dbObj) {
    val1 = param1;
    val2 = param2;
    val3 = String(dbObj.item2);

    var sqlTxt = "INSERT INTO demo (geo1, geo2, geo3) VALUES (?, ?, ?)";
    db.transaction(function(tx) {tx.executeSql(sqlTxt,[val1,val2,val3])}, errorCB, successCB);
    }
如您所见,executeQuery有4个参数, 查询 用于查询的参数, 回调(具有3个参数,结果、状态和myparam) myparam(用于回调)


我花了一些时间来解决这个问题,但当你这么做的时候!再也没有烦人的db恐怖了

我们无法为queryDB函数发送任何参数,如“queryDB(id)”

我用这种方法解决了这个问题

var contactId = 33
dbInst.transaction(function(tx){
    tx.executeSql('CREATE TABLE IF NOT EXISTS CONTACT_REFERENCE (id unique)');
    var sqlStr = 'INSERT INTO CONTACT_REFERENCE (id) VALUES (?)'
    tx.executeSql(sqlStr, [contactId]);
}, errorCB, successCB);

我想每个人都接近于回答你的问题。真的,你需要对约翰普的答案稍加修改。您应该传入带有executeSQL函数的SQLTransaction对象。因此,以约翰的回答为基础:

var id = 'THEID';
db.transaction(function(tx){
  queryDB(tx, id)
}, errorCB);
然后,在定义函数的地方,可以使用额外的变量获取id参数

queryDB: function (tx, id) { ...your code... }

我喜欢让事情变得非常简单,所以在处理phonegap应用程序上可以接收参数的存储时,我使用了数量有限的函数。我看到的许多示例都调用了许多子函数,对于我来说,在调试方面这是一场噩梦

我被发现了一些关于Web SQL的问题,但阅读规范真的,真的有助于澄清我能做什么和不能做什么。()

请看以下插入函数的简单代码:

    // execute a query and fetches the data as an array of objects
self.executeQuery = function(string, args, callback, callbackparams) {
    var self = this;
    //console.log('db execute: '+string);
    self.db.transaction(function(tx) {
        tx.executeSql(string, args, function(tx, result) {
            var retval = [];
            for (var i = 0; i < result.rows.length; ++i) {
                retval.push(result.rows.item(i));
            }
            if (callback) {
                callback(retval, result, callbackparams);
            }

        }, self.error);
    });
}
function dbInsert(param1, param2, dbObj) {
    val1 = param1;
    val2 = param2;
    val3 = String(dbObj.item2);

    var sqlTxt = "INSERT INTO demo (geo1, geo2, geo3) VALUES (?, ?, ?)";
    db.transaction(function(tx) {tx.executeSql(sqlTxt,[val1,val2,val3])}, errorCB, successCB);
    }
让我们一起走过它。显然是一个标准函数,它接收的参数可以是任何东西,在本例中是一个对象和一个字符串

sqlTxt是乐趣的开始。按照通常编写insert语句的方式编写此语句,但在通常将要插入/选择的数据等放在值中的地方,请为数据库表中要传递数据的每个字段使用占位符

现在让我们分解下一行:

db.transaction(function(tx) {tx.executeSql(sqlTxt,[val1,val2,val3])}, errorCB, successCB);
创建新数据库时,db是数据库对象的处理程序,因此db.transaction要求在数据库db上执行事务

如果我们下一节这样写,您可以看到它的函数调用tx.executeSql,因为它在db.transaction方法中执行,所以它将被传递给db句柄

function(tx) {
    tx.executeSql(sqlTxt,[val1,val2,val3])
}
现在,如果我们要解析sqlTxt,它可能是这样的

INSERT INTO demo (geo1, geo2, geo3) VALUES ('a', 'b', 'c');
因为我们传递的是三个变量,而不是保持器,所以看起来像上面的行。最后调用error和success回调函数

在您的情况下,我将创建一个queryDB函数,如下所示:

function queryDB(id) {
    var sqlTxt = "SELECT * FROM DEMO WHERE id=?"
    db.transaction(function(tx) {tx.executeSql(sqlTxt,[id])}, errorCB, successCB);
}

本质上,函数获取参数id,将其传递到[id]中的查询中,然后执行并返回error或success。显然,您可以将其扩展为使用多个参数,或者如果您想变得更聪明,只需创建一个数据库事务函数,并传入sql和参数以用作对象或数组(示例将在本周末我的博客上)

这是一个有效的解决方案:

var sqltxt= 'INSERT INTO CONTACTS(id, data) VALUES (?, ?)';
    var db = window.openDatabase("Database", "1.0", "Demo", 200000);
    db.transaction(function(tx){tx.executeSql('DROP TABLE IF EXISTS CONTACTS');
            tx.executeSql('CREATE TABLE IF NOT EXISTS CONTACTS(name unique, password)');

            tx.executeSql(sqltxt,[name, pass]);

    }, errorCB, successCB);

那么,在queryDB()函数中,我将使用tx.id获取id值吗*我说,我正在开发phonegapLike,这取决于phonegap的API(我没有使用它)。
tx
是要传递给queryDB的值吗?或者您希望API填充的方法(如事务ID)。如果您想传递它,您可以使用我在上面详细介绍的方法。
tx
可能是api将填充的方法。。。。如果我想传递它,那么我如何检索ID的值。。是tx.id吗?你链接到的文章似乎暗示它适合你。您是否尝试简单地记录以查看对象是否存在?console.log?好的..你关于通过将数据包装到函数中来传递数据的回答帮助我从另一个角度解决了这个问题。谢谢:谢谢你的解释,Rene,但是你能解释一下为什么要打2个查询吗?你有一个简单的例子吗?