0

PhoneGap と SQLite データベースを使用しています。

私はこのようなことを試みます:

関数 useSavedThing() があります。

function useSavedThing() {

        alert("BEFORE getSavedThing()");    

    getSavedThing();

        alert("AFTER getSavedThing()");

}

および関数 getSavedThing():

function getSavedThing(){

        alert("ONE");
        var db = window.openDatabase("Database", "1.0", "Database", 200000);
    db.transaction(populateDB, errorCB, successCB);
        alert("TWO");
    function populateDB(tx) {

        alert("THREE");
    }

    function errorCB(tx, err) {
        alert("Error processing SQL: " + err);
    }

    function successCB() {
        alert("FOUR");
        db.transaction(getData);
    }

    function getData(tx) {
                alert("FIVE");
        tx.executeSql('SELECT * FROM SETTINGS', [], getIt, errorCB);
    }
    function getIt(tx, results) {
                   alert("SIX");
            var savedthing = results.rows.item(0).data;


    }



}

問題は、関数 getSavedThing() が呼び出されると、最初の 2 つのアラート (alert("ONE")、alert("TWO)) のみが発行され、その後アラート ("AFTER getSavedThing ()") が呼び出されることです。

ただし、全経費アラート(「ONE」)、アラート(「TWO」)、アラート(「THREE」)アラート(「FOUR」)アラート(「FIVE」)、アラート(「SIX」)、アラートの前に発行してほしい("AFTER getSavedThing()"); 現れます。

アラートの順序は次のとおりです。

  1. alert("BEFORE getSavedThing()");
  2. アラート("ONE");
  3. アラート ("2");
  4. アラート("3");
  5. アラート("4");
  6. アラート("FIVE");
  7. アラート("6");
  8. alert("BEFORE getSavedThing()");

誰かが私を助けることができますか?

4

2 に答える 2

1

データベース操作は非同期で実行されます。最後のデータベース操作の後に実行する場合alert("AFTER getSavedThing()")は、コールバック関数から呼び出す必要がありますgetIt()

function useSavedThing() {
    alert("BEFORE getSavedThing()");
    var afterGet = function(){
        alert("AFTER getSavedThing()");
    }
    getSavedThing( afterGet ); /*pass the callback function to getSavedThing*/
}

function getSavedThing( callback ){

    alert("ONE");
    var db = window.openDatabase("Database", "1.0", "Database", 200000);
    db.transaction(populateDB, errorCB, successCB);
    alert("TWO");
    function populateDB(tx) {
        alert("THREE");
    }

    function errorCB(tx, err) {
        alert("Error processing SQL: " + err);
    }

    function successCB() {
        alert("FOUR");
        db.transaction(getData);
    }

    function getData(tx) {
        alert("FIVE");
        tx.executeSql('SELECT * FROM SETTINGS', [], getIt, errorCB);
    }

    function getIt(tx, results) {
         alert("SIX");
         var savedthing = results.rows.item(0).data;
         callback.call(); /*execute the callback function*/
    }
}
于 2013-02-01T12:12:10.153 に答える
0

このフレームワークを PhoneGap でのデータ アクセスに使用できます。非常に使いやすいことがわかります。

var db = new MyDB();
//query all users
var users = db.Users.toArrary(callback);
于 2013-02-02T14:51:12.253 に答える