• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Anchor Event registrieren und eigenes Objekt übergeben

Ich habe versucht es umzusetzen, aber der Ablauf passt immer noch nicht.
Zuerst wird "initCategory", "loadItems", "loadCategory" und dann successSelect ausgeben.

Code:
function onDeviceReadySuccess() {
    initDatabase();
    loadItems();
} 

function loadItems() {  
    initCategory();
    alert("loadItems");
    loadCategory();
}

function initCategory() {
    alert("initCategory");
    db.transaction(selectCategory, errorSelect);

    function selectCategory(tx) {       
        tx.executeSql('SELECT * FROM category WHERE parentid = ' + currentCategory, [], successSelect, errorSelect);
    }

    function errorSelect(err) {
        alert("Fehler beim Laden der Kategorien: " + err.code);
    }

    function successSelect(tx, results) {
        alert("successSelect");
        var length = results.rows.length;
        arrayCategory = new Array(length);

        for (var i = 0; i < length; i++) {
            var id = results.rows.item(i).id;
            var name = results.rows.item(i).name;
            var parentid = results.rows.item(i).parentid;

            arrayCategory[i] = new Category(id, name, parentid);
        }  
    };
}
 
Dir ist schon klar, das bei
Code:
function onDeviceReadySuccess() {
    initDatabase();
    loadItems();
}
die Funktionen initDatabase(); und loadItems(); parallel abgearbeitet werden? Das heißt, loadItems(); wartet nicht bis initDatabase(); fertig ist.
 
Ok hatte bisher damit keine Probleme:eek:

Wie kann ich das denn ändern also warten bis eine Funktion fertig ist und dann erst die nächste. Ich weiß das es mit callbacks geht aber das will bei mir nicht weiß nicht was ich falsch mache.... könnte das einer an dem Beispiel zeigen?!
 
die funktionen initDatabase und loadItems werden schon sequentiell abgearbeitet, was miniA4kuser vermutlich meint, in diesen werden asynchrone vorgänge gestartet, die dann zwar auch nicht parallel was js betrifft, aber parallel was übertragung oder ähnliches betrifft, statfinden kann.
ich sehen beim überfliegen zwar auf die schnelle deine initDatabase funktion nicht, aber sollte dort irgendwo ein callback auftauchen, dann deutet das auf asynchrone vorgänge hin.
 
Zuerst wird "initCategory", "loadItems", "loadCategory" und dann successSelect ausgeben.
Genau das ist das, was wir mit "asynchron" meinen. Der successSelect-Callback wird einfach irgendwann ausgeführt, wenn die DB fertig ist. Du musst alles, was von dem successSelect abhängig ist auch erst dort ausführen:
Code:
function loadItems() {  
    initCategory();
}

function initCategory() {
    alert("initCategory");
    db.transaction(selectCategory, errorSelect);

    function selectCategory(tx) {       
        tx.executeSql('SELECT * FROM category WHERE parentid = ' + currentCategory, [], successSelect, errorSelect);
    }

    function errorSelect(err) {
        alert("Fehler beim Laden der Kategorien: " + err.code);
    }

    function successSelect(tx, results) {
        alert("successSelect");
        var length = results.rows.length;
        arrayCategory = new Array(length);

        for (var i = 0; i < length; i++) {
            var id = results.rows.item(i).id;
            var name = results.rows.item(i).name;
            var parentid = results.rows.item(i).parentid;

            arrayCategory[i] = new Category(id, name, parentid);
        }  
        
    	alert("loadItems");
    	loadCategory();
    };
}
- oder besser mit callback:
Code:
function loadItems() {  
    initCategory(function(){
        
    	alert("loadItems");
    	loadCategory();
    });
}

function initCategory(callback) {
    alert("initCategory");
    db.transaction(selectCategory, errorSelect);

    function selectCategory(tx) {       
        tx.executeSql('SELECT * FROM category WHERE parentid = ' + currentCategory, [], successSelect, errorSelect);
    }

    function errorSelect(err) {
        alert("Fehler beim Laden der Kategorien: " + err.code);
    }

    function successSelect(tx, results) {
        alert("successSelect");
        var length = results.rows.length;
        arrayCategory = new Array(length);

        for (var i = 0; i < length; i++) {
            var id = results.rows.item(i).id;
            var name = results.rows.item(i).name;
            var parentid = results.rows.item(i).parentid;

            arrayCategory[i] = new Category(id, name, parentid);
        }  
        callback();
    };
}
 
Zurück
Oben