0

別のページに移動する前に、ローカル データベースをセットアップするために使用したいインデックス ページがあります。ただし、 window.location コードをアクティブにすると、他の関数は実行されませんが、コメントアウトすると、他の関数は正常に実行されます。これを引き起こしている原因と、関数と window.locations の両方を機能させる方法についてのアイデアはありますか? コードは次のとおりです。

<script>
        var db = window.openDatabase("DB1", "", "DB", 1024 * 1000)
            CreateDB(); //Creates local database tables
            loadRouteList(); //Queries web server database using AJAX and inserts Routes
            window.location = 'Application.html';
</script>

使用する機能:

function CreateDB() {
    db.transaction(function (tx) {
        tx.executeSql('CREATE TABLE IF NOT EXISTS Routes(id INTEGER PRIMARY KEY, routeID TEXT, customerID TEXT, stopSeq TEXT, driverID TEXT)', []);
    });
};
function loadRouteList() {
var dataObject = {
    postDesignator: 'routes',
};
$.ajax({
    url: 'http://url.php',
    data: dataObject,
    dataType: 'json',
    type: 'post',
    success: function (Result) {
        for (var i = 0, len = Result.records.length; i < len; ++i) {
            var route = Result.records[i].record;
            insertRoute(route.routeID, null, null, null);
        }
    }
});
}
4

2 に答える 2

2

コールバックを使用してください!私はあなたのコードを変更しました:

<script>
    var db = window.openDatabase("DB1", "", "DB", 1024 * 1000);
    CreateDB(); //Creates local database tables
    loadRouteList(function() { window.location = 'Application.html'} );
</script>

使用する機能:

function CreateDB() {
    db.transaction(function (tx) {
        tx.executeSql('CREATE TABLE IF NOT EXISTS Routes(id INTEGER PRIMARY KEY, routeID TEXT, customerID TEXT, stopSeq TEXT, driverID TEXT)', []);
    });
};
function loadRouteList(callback) {
    var dataObject = {
        postDesignator: 'routes',
    };
    $.ajax({
        url: 'http://url.php',
        data: dataObject,
        dataType: 'json',
        type: 'post',
        success: function (Result) {
            for (var i = 0, len = Result.records.length; i < len; ++i) {
                var route = Result.records[i].record;
                insertRoute(route.routeID, null, null, null);
            }
            // this is the so called callback, that gets executed AFTER the ajax has finished
            if(callback) { callback(); }
        }
    });
}
于 2013-05-21T20:58:25.607 に答える
1

定義上、AJAX はAsynchronous. それで、あなたはあなたのラインのためにあなたの場所が変わるポイントに到着します. 続行する前に、すべてのリクエストが完了するまで待つ必要があります。これを行うには、関数内のコードを変更する必要があります。あなたがそれらを投稿する場合、私たちはあなたを助けることができます.

編集

私の意見では、それを行う最善の方法は、関数にコールバックを渡すことです。

function CreateDB() {
    db.transaction(function (tx) {
        tx.executeSql('CREATE TABLE IF NOT EXISTS Routes(id INTEGER PRIMARY KEY, routeID TEXT, customerID TEXT, stopSeq TEXT, driverID TEXT)', []);
    });
    //if even this piece of code is async you should read docs and check how to call a function after the query executed
};
function loadRouteList(callback) {
    var dataObject = {
        postDesignator: 'routes',
    };
    $.ajax({
        url: 'http://url.php',
        data: dataObject,
        dataType: 'json',
        type: 'post',
        success: function (Result) {
            for (var i = 0, len = Result.records.length; i < len; ++i) {
                var route = Result.records[i].record;
                insertRoute(route.routeID, null, null, null);
            }
            if(callback) {
                callback();
            }
        }
    });
}

そして、次のように使用します。

var db = window.openDatabase("DB1", "", "DB", 1024 * 1000)
    CreateDB(); //Creates local database tables
    loadRouteList(function() {
        window.location = 'Application.html';
    });
于 2013-05-21T20:35:12.403 に答える