RFZ: synchrone Datenbankabfrage (HTML5 WebDatabase)

Beitrag lesen

Moin,
ich würde gerne mittels HTML5 Features einen synchronen Zugriff auf die Browserdatenbank erzielen.

Laut HTML WebDatabase [w3.org] ist ein synchroner Zugriff vorgesehen, wird aber z.B. von Google Chrome nicht unterstützt.
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.

Ich würde die asynchrone Schnittstelle daher irgendwie gerne synchron bekommen, scheitere aber leider daran.

  
// var db existiert global...  
			  
function testQuery(){  
	res = querySync('SELECT name FROM tabelle WHERE id = 115;');  
	alert(res); // liefert null ohne alert() in querySync()  
}  
  
function querySync(q,p){  
	this.completed = false;  
	this.result = null;  
	db.transaction(  
		function (transaction) {  
			transaction.executeSql(q,p,  
				function(t,r){  
					this.result = r;  
					this.completed = true;  
				}  
			);  
		},  
		function(e){  
			alert('SQL-Error in Query "'+q+'"\r\nError Message: '+e.message);  
		}  
	);  
	for(i=0; i<100; i++) wait(10);	// Wartezeit hat leider keinen Einfluss  
	alert('finished');	// mit alert() klappt es, ohne alert() kommt null zurück  
	return this.result;  
}  
  
// Typische wait-Funktion, aus dem Internet gekrallt  
function wait(millis) {  
	var date = new Date();  
	var curDate = null;  
	do { curDate = new Date(); }  
	while(curDate-date < millis);  
}  

Eigentlich wollte ich in einer Schleife auf this.completed warten.
Das problem ist, dass this.completed in der Funktion querySync() nicht aktualisiert wird.

Im obigen Beispiel (alert() auskommentiert) erhalte ich immer null zurück, egal wie lange ich mittels wait() warte.
Ist dagegen das alert() nicht auskommentiert, erhalte ich das SQL Result zurück.

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.

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