2

リモート 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");
}
4

2 に答える 2

1

jQuery ajax には ajax リクエストを同期させる設定があります。とても簡単にできます

$.ajaxSetup({'async': false});

...または.ajax、リクエストごとに個別にこれを使用して設定します。

リクエストを全体として非同期にしたいが、順番に起動したい場合は、ある種のキューを作成する必要があります: https://gist.github.com/3818056 -- おそらく Deferred API を使用しませんが、できる。次のように使用します。

var aq = new AjaxQueue();
aq.push({'type': 'get', 'dataType': 'json', 'url': 'index.php/get/sync_riesgo',
   'success': "you're really long function"});
aq.push({'type': 'get', 'dataType': 'json', 'url': 'index.php/get/sync_operaciones',
   'success': "you're really long function"});

もちろん、これには、ajax キューが空になるまで実行し続けるまでクライアントを実行し続ける必要もあります。可能であれば、次のことをお勧めします。

$(window).on('beforeunload', function () {
   if (aq.q.length) {
      return "Still doing back end processing; please stay on page for a moment";
   }
});
于 2012-10-02T10:29:05.787 に答える
0

ここで解決策を見つけたかもしれないと思います:

HTML5 WebSQL:dbトランザクションがいつ終了するかを知る方法は?

さまざまな INSERT ステートメントを作成する方法と、Promise を次々と処理する方法を知る必要があります。しかし、それはチェーンされたコールバックの小さなセットです。

于 2012-10-02T10:37:50.620 に答える