molily: synchrone Datenbankabfrage (HTML5 WebDatabase)

Beitrag lesen

Laut HTML WebDatabase [w3.org] ist ein synchroner Zugriff vorgesehen, wird aber z.B. von Google Chrome nicht unterstützt.

Wenn es nur möglich ist, solltest du asynchronen Zugriff verwenden! Synchroner Zugriff macht die Sache nur langsam und dadurch nicht berechenbarer. Jegliches Input/Output in JS ist asynchron - und das ist eigentlich auch gut so.

Was funktioniert, ist der asynchrone Zugriff, der die Programmierung (in meinen Augen) bei vielen Queries schnell komplett unübersichtlich macht.
Auch ist ein fester Programmablauf extrem schwer zu kontrollieren.

Das ist wohl Übungs- und Gewöhnungssache. Was genau hast du vor? Dein Beispiel ist nicht komplex. Es ist synchroner viel komplexer, weil du das Unmögliche möglich machen willst. Einfache SELECTs sind asynchron recht einfach zu lösen. Der Programmablauf ist zudem determiniert. In der Reihenfolge, in der du die DB-Befehle ausführst, werden auch die Antwort-Callback aufgerufen.

Klar, wenn du viele hintereinandergeschaltete Operationen hast (SELECT, dann ggf. auf jedem Eintrag ein UPDATE, bei dessen Erfolg eine Änderung der Anzeige), dann ist die Callback-Schachtelung entsprechend komplex. Das ist allerdings eine Frage der sinnvollen Strukturierung des Programms und übersichtlichen Aufteilung in Funktionen.

Das alert() hält also offensichtlich die Ausführung der Funktion querySync() an, nicht aber die Ausführung des Callbacks, welches dann die Variable this.result ersetzen kann.

Richtig - JavaScript ist streng single-threaded, es wird immer nur eine Funktion gleichzeitig ausgeführt. Wenn ein JavaScript läuft, dann kann nicht gleichzeitig im Hintergrund eine andere ausgeführt werden (Ausnahme: Web Workers).

Jegliche »wait«-Funktionen in JavaScript sind daher Quatsch. Man kann in JS nicht aktiv »nichts tun«, bis eine andere Funktion ausgeführt wird, denn die wartende Funktion wird erst dann ausgeführt, wenn der Interpreter zur Ruhe kommt und die aktuelle Funktion sich beendet. »Besseres« Warten mit setTimeout ist auch immer asynchron, d.h. mit Callbacks. Die werden ausgeführt, wenn der Interpreter keine anstehenden Funktionsaufrufe mehr abzuarbeiten hat. Es gibt also nur eine »Ausführungs-Warteschleife«, kein paralleles Ausführen.

Sieht jemand von Euch eine Möglichkeit das Problem zu lösen?

Ja: Verstehe die funktionale und asynchrone Natur von JavaScript. Dann kannst du dir ziemlich einfach und schnell brauchbare Helferfunktionen schreiben. Der übergibst du dann eine Callback-Funktion (z.b. einen Funktionsausdruck oder eine Funktion über ihren Namen):

dbquery('SELECT name FROM tabelle WHERE id = 115;', function (transaction, results) {  
   alert(results);  
});  
  
function dbquery(query, parameters, callback){  
   db.transaction(function (transaction) {  
      transaction.executeSql(query, parameters, callback, function (e) {  
         alert('SQL-Error in Query "' + q + '"\r\nError Message: ' + e.message);  
      });  
   });  
}

Wozu genau meinst du unbedingt synchronen Zugriff zu brauchen? Wie gesagt, weil JavaScript so funktioniert, wie es funktioniert, wird es unübersichtlicher, schwieriger und letztlich unmöglich sein, Synchronizität vorzutäuschen.

Mathias