Originariamente inviato da @l3b
Non sapevo che openDatabase lavorasse in modo asincrono in Safari
non è safari, sono le specs HTML5 che dicono di rilasciare immediatamente il flusso di esecuzione alla chiamata transaction, di qui il motivo di una callback, quando c'è una callback da utilizzare al 99% si tratta di flusso asincrono.
Il fatto che abbiano scelto qusta stada è semplice e sensato. Operazioni in DB possono essere molto "costose" e se fai una join da milioni di risultati la tua pagina potrebbe risultare inutilizzabile fino alla fine del processo (magari 2 soli campi che sono il risutlato di milioni di operazioni in query)
Questo è il motivo per cui Google ha implementato il WorkerPool il quale lavora in multi thread, ovvero non blocca la pagina, fa quello che deve fare, si riallaccia alla pagina quando tutto è finito e in tutti i PC moderni il risultato sarà trasparente per prestazioni o altro ... l'utente non deve aspettare che l'esecuzione sia terminata (stesso motivo per il quale Ajax è usato asincrono, se carichi 1 mega di dati ad esempio non puoi fare niente fino a dati caricati)
Originariamente inviato da @l3b
In ogni caso se io elimino le insert (il database una volta creato rimane sempre disponibile finchè l'utente non lo elimina manualmente) pertanto la chiamata a printProd dove la dovrei mettere?
il database lo crei se non c'è ma se c'è ti ci devi connettere comunque.
Unica cosa che devi fare è usare una query differente.
codice:
myDB.transaction(
function(transaction){
transaction.executeSql('CREATE TABLE IF NOT EXISTS prodotto(codice INTEGER NOT NULL PRIMARY KEY, nome TEXT NOT NULL, caratteristiche TEXT NOT NULL, descrizione TEXT NOT NULL, prezzo INTEGER NOT NULL);',[],nullDataHandler,errorHandler);
}
);
al posto del nullDataHandler, esendo questa query la principale qualunque altra cosa dovrebbe essere attivata dopo l'esecuzione di questa query o rischi di operare su una tabella inesistente.
Non credo sia un forum il posto adeguato per capire gestioni multi thread ed asincrone, ti consiglio qualche articolo o guida sull'argomento poichè sebbene tutti abbiano Ajax in bocca, pochi sono in grado di gestire flussi dati e interazioni asincrone con eventi nel mezzo.
Soluzione semplice: us sistema di queue che ti permette di aggiungere cose da fare senza problemi e delegare la gestione dell'ordine chiamate. Ancora, più di questo non posso dirti ma spero di averti dato qualche aiuto.