リモート MySQL サーバーと同期する必要があるローカル WebSQL データベースがあります。そのために、プロセスを複数のリクエストに分割したので、リクエストごとにコールバックを起動して進行状況を表示できます。
問題は、挿入ステートメントが $.each() 関数 (別名 for ループ) 内にあるため、コールバックで解決できないと思われる深刻な競合状態があることです。
この非同期の問題は、データベース インターフェイス全体に広がっています。jQuery で promises と Deferred を使用する方法を調査していますが、問題は解決していないようです。このことを同期させる必要があるだけです。
evalua.webdb.sync = function(callback){
$.getJSON("index.php/get/sync_riesgo",function(data){
evalua.webdb.db.transaction(function(tx){
$(data.riesgos).each(function(index, value){
tx.executeSql('INSERT INTO riesgos (idRiesgo, nombre) VALUES ("'+value.idRiesgo+'", "'+value.nombre+'")');
});
$(data.estancias).each(function(index, value){
tx.executeSql('INSERT INTO estancias (idEstancia, nombre, dimensionMinima) VALUES ("'+value.idEstancia+'", "'+value.nombre+'", "'+value.dimensionMinima+'")');
});
$(data.riesgosestancias).each(function(index, value){
tx.executeSql('INSERT INTO riesgosestancias (idRiesgoEstancia, idRiesgo, idEstancia, porcentaje, indispensable) VALUES ("'+value.idRiesgoEstancia+'", "'+value.idRiesgo+'", "'+value.idEstancia+'", "'+value.porcentaje+'", "'+value.indispensable+'")');
});
});
});
callback("First one done");
$.getJSON("index.php/get/sync_operaciones",function(data){
evalua.webdb.db.transaction(function(tx){
$(data.companhias).each(function(index, value){
tx.executeSql('INSERT INTO companhias (idCompanhia, nombre) VALUES ("'+value.idCompanhia+'", "'+value.nombre+'")');
});
$(data.operaciones).each(function(index, value){
tx.executeSql('INSERT INTO operaciones (idOperacion, nombre, descripcion) VALUES ("'+value.idOperacion+'", "'+value.nombre+'", "'+value.descripcion+'")');
});
});
});
callback("Second one done");
}