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

cjm*_*ing 3 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); 
Run Code Online (Sandbox Code Playgroud)

在db.transaction中我想将一个变量作为参数传递给queryDB函数,所以我想到的代码应该是这样的

db.transaction(queryDB(id), errorCB);
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*hnP 6

再次将其包裹在一个函数中

var id = 'THEID';
db.transaction(function(){
  queryDB(id)
}, errorCB);
Run Code Online (Sandbox Code Playgroud)

注意 - 这是假设您正在制作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
}
Run Code Online (Sandbox Code Playgroud)

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


The*_*chy 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);
    }
Run Code Online (Sandbox Code Playgroud)

让我们走过它.显然是一个标准函数,它接收可以是任何东西的参数,在这种情况下是一个对象以及一个字符串.

sqlTxt是有趣的开始.写这个就像你通常会写一个insert语句一样,但是你通常会在VALUES中插入/选择数据等等,使用要将数据传入的数据库表中每个字段的占位符.

现在让我们分解下一行:

db.transaction(function(tx) {tx.executeSql(sqlTxt,[val1,val2,val3])}, errorCB, successCB);
Run Code Online (Sandbox Code Playgroud)

创建新数据库时,db是数据库对象的处理程序,因此db.transaction要求在数据库db上执行事务.

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

function(tx) {
    tx.executeSql(sqlTxt,[val1,val2,val3])
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我们要解析sqlTxt,它可能看起来像这样

INSERT INTO demo (geo1, geo2, geo3) VALUES ('a', 'b', 'c');
Run Code Online (Sandbox Code Playgroud)

因为我们正在传递三个变量来代替持有人,它看起来像上面的线.最后,您调用错误和成功回调函数.

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

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

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