Newsgroup: it.comp.lang.javascript
Titolo: Web database e comportamento anomalo in chiamata a metodo

Spezzone di codice:
 
function DAL(){
	var db = window.openDatabase("test","1","test",1000);
 
	this.write=function(txt){
		try {
			db.transaction(function(tx){
				var sql=
			"INSERT INTO prova(testo) VALUES(?)";
				tx.executeSql(sql, [txt]);
			});
		} catch(e) {
			return false;
		}
		return true;
	}
}
 
var dal = new DAL();
 
 
Diciamo che Test contiene giï¿œ la tabella prova (id int pk autoincrement, 
testo text).
 
ora viene il bello:
 
dal.write("QUALCOSA");
 
funziona correttamente, riga aggiunta al db.
 
var esito = dal.write("QUALCOSA");
 
questo invece NO. I test li sto facendo con Chrome. Il debugger nel 
secondo caso mostra che dentro alla function(tx) NON si passa, arriva a 
db.transaction e semplicemente la function interna viene saltata a piï¿œ 
pari. Nessun errore, nessuna eccezione, non viene eseguita e basta. In 
qualsiasi modo si cerchi di usare il valore di ritorno di write la 
transazione viene ignorata senza errori. E non capisco perchï¿œ.
 
-- 
r--r--r--

 transazione viene ignorata senza errori. E non capisco perchï¿œ.
 
Spero ti sia piï¿œ chiaro adesso. Se aggiungi le funzioni di callback,
puoi mandare sulla console eventuali errori che ottieni.
Ma, ripeto, non puoi avere un valore di ritorno.
 

 Il metodo `transaction` ï¿œ asincrono, significa che prende quella
 
Ti ringrazio per il chiarimento! Tuttavia dopo ulteriori prove sono 
convinto di essere incappato in un bug infido di Chrome.
 
Ho modificato la mia write cosï¿œ:
 
     this.write = function(what) {
         db.transaction(function(tx) {
             var sql = "INSERT INTO prova(testo) VALUES(?)";
             tx.executeSql(sql, [what], function(t, r) {
                 alert("Fatto");
             }, function(t, e) {
                 alert("Errore exec: " + e.message);
             });
         }, function(e) {
             alert("Errore tx: " + e.message);
         });
     }
 
La cosa curiosa ï¿œ questa:
 
var obj = new DAL();
obj.write("una bella frase");
alert("Dopo write");
 
Vedo "Dopo Write" ma "Fatto" non esce nï¿œ prima nï¿œ dopo nï¿œ mai. E nel DB 
non ci trovo nulla. Se tolgo alert("Dopo write") esce correttamente 
"Fatto" e mi trovo la riga nel db. In qualche modo alert annulla la 
funzione asincrona che non viene mai portata a termine. Non credo sia da 
considerare un comportamento normale. Per come era scritto il codice 
originale (che non ho riportato per intero) ero convinto che il problema 
si manifestasse cercando di leggere il valore di ritorno di write. Tolto 
l'assegnamento (ma anche un alert che veniva subito dopo!) magicamente 
tutto funzionava...
 
Il sospetto che si tratti in qualche modo di un bug di Chrome ï¿œ dovuto 
al fatto che lo stesso codice fatto girare su Opera visualizza sia "Dopo 
write" che "Fatto" e il valore nel db me lo trovo sempre, che mi sembra 
un comportamento piï¿œ sano.
 
-- 
r--r--r--

 un comportamento più sano.
 
Sospetto che possa essere dovuto alla natura multiprocesso di Chrome, ma
è appunto un sospetto.

 una chiamata bloccante.
 
Mea culpa! In genere non metto mai gli alert e al log su console 
preferisco mettere un breakpoint e analizzarmi con comodo la situazione.
 
Di solito uso Firefox che perï¿œ non ha il supporto per i web database, 
Chrome non l'ho mai usato se non per i test, mai per sviluppo, quindi 
per me ï¿œ un po' una novitï¿œ. Non riuscendo a venire a capo del problema e 
vedendo che il debugger non mi aiutava ho avuto un'istantanea 
regressione alla preistoria, quando l'unica speranza era costellare il 
codice di alert e vedere se e quando passava di li!
 
 

 codice di alert e vedere se e quando passava di li!
 
Tranquillo, è comprensibile. :)