【问题标题】:javascript callback function parametersjavascript回调函数参数
【发布时间】:2014-03-03 15:30:58
【问题描述】:

我想使用 javascript 调用回调函数,正如您从 http://docs.phonegap.com/en/3.0.0/cordova_storage_storage.md.html#database_size 的示例代码中看到的那样

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

function querySuccess(tx, results) {
    console.log("Returned rows = " + results.rows.length);
    // this will be true since it was a select statement and so rowsAffected was 0
    if (!results.rowsAffected) {
        console.log('No rows affected!');
        return false;
    }
    // for an insert statement, this property will return the ID of the last inserted row
    console.log("Last inserted row ID = " + results.insertId);
}

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

var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
db.transaction(queryDB, errorCB);

方法“queryDB”在没有任何参数的情况下被调用,但该函数被定义为接收变量“tx”。来自 PHP,我无法理解它是如何工作的,因为它确实如此。 还有 querySuccess 接收 2 个参数并且也可以工作。

我的问题是我需要发送 1 我自己的参数,所以我修改了对 queryDB 的调用,如下所示:

var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
db.transaction(queryDB(myParam), errorCB);

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

但它不起作用。

1) 怎么会收到未发送的参数? 2)如何添加自己的参数而不破坏它?

【问题讨论】:

  • 当您将myParam 发送到queryDB(myParam) 时会出现什么错误?
  • 我不知道,因为我在设备模拟器上运行并且我还没有调试控制台。但是 JpBaena13 解释了为什么它不能按预期工作。
  • JavaScript 中的参数是一个建议,而不是强制要求。无论声明了哪些参数,所有函数都可以采用任意数量的参数(从 0 到 9999 及以上)。您可以将参数视为索引参数的别名:function foo(a,b,c) {...} 基本上等同于 function foo(){ var a = arguments[0], b = arguments[1], c = arguments[2]; ...}

标签: javascript cordova parameters callback


【解决方案1】:

试试这个:

db.transaction(function() { queryDB(tx, myParam); }, errorCB);

function queryDB(tx, myParam) {
    //logic here
}

事务函数正在寻找不包含参数的回调方法。您可以通过分配一个匿名函数来“劫持”它,该函数使用参数调用您想要的函数。

【讨论】:

  • 但是我认为“tx”是函数接收到变量时接收到的名称,但是我怎样才能发送一个不存在也没有创建过的变量呢?谢谢!
  • 这就是我在上面展示的内容。您必须首先传递 tx 参数,因为这是交易的运作方式,通过使用匿名函数作为回调,您可以通过调用传递其他参数(即 queryDB(tx, myParam)。您必须传递 tx,但使用上面的方法你也可以传递myParam或者你想传递的任何其他参数。
  • 但是 'tx' 并没有像 OP 所说的那样创建。
  • 是的,db.transaction 自动将tx 传递给分配给它的回调函数参数。
【解决方案2】:

当你写作时

db.transaction (queryDB, errorCB);

您将函数本身作为参数传递,但如果您尝试这样做:

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

您将作为参数传递函数的结果,这将产生错误。

db.transacción接收参数是2个函数,如果需要传递自定义参数,只需将它们写在声明中

function queryDB(tx, myParam) {
    //Using your myParam
    tx.executeSql('SELECT * FROM DEMO', [], querySuccess, errorCB);
}
...
db.transaction(queryDB, errorCB);

请记住,javascript 是一种解释型编程语言,不是面向对象的

【讨论】:

  • myParam 不会在函数 queryBD 范围内未定义吗?
【解决方案3】:

好的,我想我已经找到了答案。 从这里阅读http://theelitist.net/passing-additional-arguments-to-a-callback-function-in-javascript 我意识到 Dawson Loudon 的响应几乎完成了,但他错过了应该在调用第二个函数的第一个函数上传递的“tx”变量,即:

db.transaction(function(tx) { queryDB(tx, myParam); }, errorCB);

function queryDB(tx, myParam) {
    //logic here
}

感谢您的时间和帮助。

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 2015-11-12
    • 2012-10-11
    • 2011-03-28
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多