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

时间:2012-01-08 07:06:54

标签: 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("Database", "1.0", "PhoneGap Demo", 200000);
db.transaction(queryDB, errorCB); 
db.transaction中的

我想将一个变量作为参数传递给queryDB函数,所以我想的代码看起来应该是

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

我如何实际实现这个?或者它只是像这样工作,我的身份证将被传递并进入tx?

6 个答案:

答案 0 :(得分:6)

再次将其包裹在一个功能中

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
}

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

答案 1 :(得分:6)

我喜欢保持简单,所以在处理可以接收参数的phonegap应用程序上的存储时,我使用的函数数量有限。我见过的很多例子都调用了很多子函数,对我来说,调试时这是一场噩梦。

我遇到了围绕Web SQL的一些问题,但实际上阅读了这些规范,确实有助于澄清我能做什么和不能做什么。 (http://www.w3.org/TR/webdatabase/

查看插入函数的这个简单代码:

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是有趣的开始。按照通常编写插入语句的方式编写,但在 VALUES 中通常要插入/选择数据的位置,请使用占位符来填充要将数据传入的数据库表。

现在让我们分解下一行:

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

因为我们传递的是三个变量代替持有者,所以它看起来就像上面的那一行。最后,您调用错误和成功回调函数。

在你的情况下,我会创建一个这样的queryDB函数:

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

本质上,函数抓取参数id,将其传递给[id]中的查询并执行并返回错误或成功。显然你可以扩展它以使用多个参数,或者如果你想要非常聪明,你只需创建一个数据库事务函数并传入sql和参数以用作对象或数组(示例将在本周末在我的博客上)

答案 2 :(得分:2)

好的,首先创建一个类帽子将处理你的数据库实例(数据库更新等)这个类将保存一个函数,你将用于所有查询的

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

然后当你开始上课的时候(我把它命名为myDb)去吧!

myDb.executeQuery('select l.* from location l inner join item_location il on (il.location_id = l.id and il.item_id = ?)', [item.id], function(locations, res, item){
                item.locations = locations;
                myDb.executeQuery('select * from media where item_id = ?', [item.id], function(media, res, item){
                    item.media = media;
                    // create item.
                    createItem(item);                       
                }, item);
            }, item);

你可以看到executeQuery有4个参数, 查询, 用于查询的参数, 回调(有3个参数,结果,状态和myparam) myparam(用于回调)

我花了一些时间来解决这个问题,但是当你这样做的时候!没有更烦人的数据库恐怖!

答案 3 :(得分:0)

我们不能发送查询功能的任何参数,如“查询DB(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);

答案 4 :(得分:0)

我认为每个人都接近回答你的问题。真的,你需要对JohnP的答案稍作修改。您应该传入带有executeSQL函数的SQLTransaction对象。所以以John的答案为基础:

var id = 'THEID';
db.transaction(function(tx){
  queryDB(tx, id)
}, errorCB);

然后在定义函数的地方,您可以使用额外的变量获取id参数。

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

答案 5 :(得分:0)

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

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