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

最後の行では、オブジェクトdbからメソッドtransactionを呼び出し、引数フィールドに3つの関数がありますが、関数populateDB、errorCBの両方にも引数が必要ではありませんか?その議論はどこで呼ばれていますか?

4

4 に答える 4

2

これらはコールバックです。つまり、transactionメソッドは成功または失敗に応じて1つまたは他の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 に答える
2

データベースランタイムは、必要なときにこれらの関数を呼び出し、パラメーターを渡します。「db.transaction」関数呼び出しでは、関数への参照を渡します。その時点では、呼び出す関数を特定しているだけなので、関数パラメーターは必要ありません。

于 2012-06-19T19:47:26.970 に答える
1

これらの関数は、コールバックの設計方法に基づいて自動的に引数を受け取ります。関数への参照を渡し、コールバックがその参照を使用すると、メカニズム全体の構築方法に基づいてパラメーターが設定されます。基本的に、トランザクションオブジェクトは、参照を指定したメソッドを呼び出し、渡す予定のメソッドを渡すことを認識しています。(実行しているときに)必ず収集するのはユーザーの責任です。

これが少し紛らわしい唯一の理由は、トランザクション関数をクラックして開いていないためです。そうした場合、それらの関数を呼び出し、後で収集する値を渡すことがわかります)。

于 2012-06-19T19:47:33.990 に答える
0

javascriptには、関数内でデータを取得/設定するためのいくつかのメソッドがあります。メソッド-callapplyargumentsvarを参照してください。

于 2012-06-19T19:48:56.220 に答える