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

时间:2016-10-05 09:04:26

标签: javascript jquery ajax .when

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

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

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

如果我发送几个标记的坐标,它可以工作,但是如果我尝试发送200个标记,则第二个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");

编辑:

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

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");

2 个答案:

答案 0 :(得分:1)

看起来您的layer.eachLayer函数未返回Promise / Deferred。沿着jQuery doc:

  

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

答案 1 :(得分:1)

好的,所以我通过这篇文章找到了解决方案: 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");