繁体   English   中英

当另一个请求完成时执行一个 Ajax 请求

[英]Execute an Ajax request when another one is finished

我循环遍历 Leaflet 地图中的标记层以捕获每个标记的纬度和经度,并使用 Ajax 将此坐标发送到我的数据库中。

然后,当我发送了数据库中每个标记的纬度和经度时,我想用另一个 Ajax 调用我的 WFS 层以显示添加到我的数据库中的新标记。

为此,我想在第一个 Ajax 完成后调用我的第二个 Ajax,所以我尝试使用 $.when().done(),但它不起作用。

如果我发送几个标记的坐标,它可以工作,但是如果我尝试发送 200 个标记,则第二个 Ajax 会在第一个 Ajax 结束之前执行,并且不会显示我的 WFS 图层。 如果我在第二个 Ajax 上设置超时以给第一个 Ajax 执行时间,它会起作用,但这不是解决方案。

这是我的代码:

var dialog_create = $('#dialog_create').dialog();
dialog_create.dialog(options, {
  buttons: {
    Add: function() {
      $.when(
        layer.eachLayer(function(layer) {
          latGPS = layer.getLatLng().lat;
          lngGPS = layer.getLatLng().lng;

          $('#latitudeEP').val(latGPS);
          $('#longitudeEP').val(lngGPS);

          data = $("#formulaireEP").serialize();

          $.ajax({
            url: 'assets/php/create/create_EP.php',
            type: $("#formulaireEP").attr('method'),
            data: data,
            success: function() {
              dialog_create_EP.dialog("close");
              $("#formulaireEP")[0].reset();
            }
          })
        })
      ).done(function(data) {
        //setTimeout(function(){
        $.ajax({
          url: owsrootUrlAssainissement + L.Util.getParamString(parametersEP),
          dataType: 'jsonp',
          jsonpCallback: 'callEP'
        }).done(EPvannes1);
        //},5000);
      });
      return false;
    },
    Cancel: function() {
      dialog_create_EP.dialog("close");
    },
  }
});
dialog_create_EP.dialog("open");

编辑 :

这是我使用延迟对象的最佳尝试,但它不起作用......

 var dialog_create = $('#dialog_create').dialog(); dialog_create.dialog(options, { buttons: { Add: function() { var defer = $.Deferred(); function getAjaxDeffered(){ layer.eachLayer(function(layer) { latGPS = layer.getLatLng().lat; lngGPS = layer.getLatLng().lng; $('#latitudeEP').val(latGPS); $('#longitudeEP').val(lngGPS); data = $("#formulaireEP").serialize(); $.ajax({ url: 'assets/php/create/create_EP.php', type: $("#formulaireEP").attr('method'), data: data, success: function() { dialog_create_EP.dialog("close"); $("#formulaireEP")[0].reset(); } }) }) } defer.resolve(getAjaxDeffered()); $.when(defer).then(function(data) { //setTimeout(function(){ $.ajax({ url: owsrootUrlAssainissement + L.Util.getParamString(parametersEP), dataType: 'jsonp', jsonpCallback: 'callEP' }).done(EPvannes1); //},5000); }); return false; }, Cancel: function() { dialog_create_EP.dialog("close"); }, } }); dialog_create_EP.dialog("open");

看起来您的layer.eachLayer函数没有返回 Promise/Deferred。 沿着 jQuery 文档:

如果将单个参数传递给 jQuery.when() 并且它不是 Deferred 或 Promise,它将被视为已解决的 Deferred 并且任何附加的 doneCallbacks 将立即执行。

好的,多亏了这篇文章,我找到了解决方案: jquery deferred in .each loop

这是我给后代的最终代码;-):

 var dialog_create = $('#dialog_create').dialog(); dialog_create.dialog(options, { buttons: { Add: function() { function getAjaxDeffered(){ var promises = []; layer.eachLayer(function(layer) { var def = new $.Deferred (); latGPS = layer.getLatLng().lat; lngGPS = layer.getLatLng().lng; $('#latitudeEP').val(latGPS); $('#longitudeEP').val(lngGPS); data = $("#formulaireEP").serialize(); $.ajax({ url: 'assets/php/create/create_EP.php', type: $("#formulaireEP").attr('method'), data: data, success: function() { def.resolve(); dialog_create_EP.dialog("close"); $("#formulaireEP")[0].reset(); } }) promises.push(def) }) return $.when.apply(undefined, promises).promise(); } defer.resolve(getAjaxDeffered()); getAjaxDeffered().then(function(data) { $.ajax({ url: owsrootUrlAssainissement + L.Util.getParamString(parametersEP), dataType: 'jsonp', jsonpCallback: 'callEP' }).done(EPvannes1); }); return false; }, Cancel: function() { dialog_create_EP.dialog("close"); }, } }); dialog_create_EP.dialog("open");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM