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

标签 javascript jquery ajax .when

我循环遍历 Leaflet map 中的标记层以捕获每个标记的纬度和经度,并使用 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 文档:

If a single argument is passed to jQuery.when() and it is not a Deferred or a Promise, it will be treated as a resolved Deferred and any doneCallbacks attached will be executed immediately.

关于javascript - 当另一个请求完成时执行一个 Ajax 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39869697/

相关文章:

javascript - ajax 响应后我的 javascript 停止工作

jquery - ajax 发布后,附加的 div 未在 IE 8 中显示

javascript - EPUB3、iBooks 1.5、CSS3 和 Javascript 信息

javascript - 选择并单击类中的链接

javascript - CakePHP SSE 或悬挂获取

javascript - Jquery 将 CSS 应用于动态创建的表行

javascript - jQuery on() 不适用于已添加的 DOM 项

javascript - 在ajax错误上执行javascript函数

javascript - 表单标签和 AJAX 请求

javascript - SVG 背景图像中的旋转条纹