0

所以我从一些网络上阅读了教程,他们做了这样的事情。

function populateDB(tx) {
     tx.executeSql('DROP TABLE IF EXISTS DEMO');
     tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)');
     tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")');
     tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")');
}

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

function successCB() {
    alert("success!");
}

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

最后一行,他们从object db调用了方法transaction,argument字段中有3个函数,但是函数populateDB,errorCB不是都需要一个参数吗?这个论点在哪里被调用?

4

4 回答 4

2

数据库运行时会在需要时调用这些函数,并传入参数。在“db.transaction”函数调用中,您传递对函数的引用。此时,不需要函数参数,因为您只是确定要调用哪些函数。

于 2012-06-19T19:47:26.970 回答
2

这些是回调,这意味着该transaction方法将根据成功或失败调用一个或其他 CB 函数。

该方法可能像这样工作:

db.transaction = function(populateDB, errorCB, successCB) {
    // Try to do the requested action
    var tx = performTransaction(populateDB);

    // If the action failed, call the error callback, 
    // otherwise call the success callback
    if (tx==false) {
        var err = new TransactionError();
        return errorCB(err);
    } else {
        return successCB(tx);
    }
}
于 2012-06-19T19:52:58.590 回答
1

这些函数根据回调的设计方式自动接收参数。您传入对函数的引用,当回调使用该引用时,它会根据整个机制的构建方式填充参数。基本上,事务对象知道调用您提供了引用的方法并传入它打算传入的任何内容。确保收集它取决于您(就像您正在做的那样)。

这有点令人困惑的唯一原因是因为您还没有破解打开事务功能。如果你这样做了,你会看到它调用这些函数并传入你稍后收集的值)。

于 2012-06-19T19:47:33.990 回答
0

javascript 有几种方法可以在函数内部获取/设置数据,请参阅:方法 -调用应用参数var

于 2012-06-19T19:48:56.220 回答