0

私の例では、ある関数から別の関数に変数 ( var ttoken ) を渡し、それを SQLite に保存しようとしています。コーディング環境はPhonegap(android用)です。手順は次のとおりです。

var ttoken;    // global var declaration
function handleLogin() {
var form = $("#loginForm");
var u = $("#username", form).val();
var p = $("#password", form).val();
if(u!= '' && p!= '') {
    $.post("http://localhost/login.php", {username:u, password:p}, function(data){
        if(data!='') {
            $.mobile.changePage("change_page.html");
            ttoken = data.token;
        } else {
            navigator.notification.alert("Error try again", function() {});
        }
    }, "json");
} else {
    navigator.notification.alert("Error, fields are emty", function() {});
}
return {tkn:ttoken};    // putting into array
openDB();
populateDB();
}

var db;
function openDB(){  // create database
    // 'Kurskoffer_DB' vol. 300 Kb
    db = window.openDatabase("Sample_DB", "1.0", "Samole DB", 300000);
    db.transaction(populateDB, errorCB, successCB);
}

function populateDB(tx){    // create 'settings' table
    var tooken = handleLogin();    // accessing the variable ttoken
    tx.executeSql('CREATE TABLE IF NOT EXISTS settings (id INTEGER PRIMARY KEY, token TEXT NOT NULL, sound TEXT NOT NULL, vibra TEXT NOT NULL)');
    tx.executeSql('INSERT INTO settings(id, token, sound, vibra) VALUES (1, "'+tooken.tkn+'", "on", "on")');
}

変数の受け渡し規則によるとすべて問題ないようですが、フィールド token のテーブルへの挿入結果はundefinedです。なぜこれが起こっているのか誰にも分かりますか?ありがとう。

4

1 に答える 1

0

$.post関数は非同期です。つまり、コールバックが発生handleLoginする前に戻り、返されたオブジェクトで未定義のままになります。postttoken

handleLoginコールバックを受け入れるように設定します。コールバックは、postが返さttokenれて入力されたときに発生します。

何かのようなもの:

function handleLogin(callback) {
    var form = $("#loginForm");
    var u = $("#username", form).val();
    var p = $("#password", form).val();
    if(u!= '' && p!= '') {
        $.post("http://localhost/login.php", {username:u, password:p}, function(data){
            if(data!='') {
                $.mobile.changePage("change_page.html");
                ttoken = data.token;
                if (callback) callback();
            } else {
                navigator.notification.alert("Error try again", function() {});
            }
        }, "json");
    } else {
        navigator.notification.alert("Error, fields are emty", function() {});
    }
}

function populateDB(tx){    // create 'settings' table
    handleLogin(function() {
        tx.executeSql('CREATE TABLE IF NOT EXISTS settings (id INTEGER PRIMARY KEY, token TEXT NOT NULL, sound TEXT NOT NULL, vibra TEXT NOT NULL)');
        tx.executeSql('INSERT INTO settings(id, token, sound, vibra) VALUES (1, "'+ttoken+'", "on", "on")');
    });
}

はグローバルに定義されているためttoken、引数として渡すことを心配する必要はありません。

于 2013-01-27T15:14:36.653 に答える