2

我有一个本地 WebSQL 数据库,需要与远程 MySQL 服务器同步。为此,我将流程拆分为多个请求,因此我可以在每个请求之间触发回调以显示进度。

问题是我这里有严重的竞争条件,我认为我不能用回调来解决,因为插入语句在 $.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:如何知道数据库事务何时完成?

我仍然需要知道如何制作不同的 INSERT 语句,并一个接一个地处理承诺。但这是一组较小的链式回调。

于 2012-10-02T10:37:50.620 回答