javascript - Ajax jQuery.when() 与 each() 循环

标签 javascript jquery ajax

有一个动态数量的元素具有 data-url 属性,其中包含返回其 HTML 内容的 ajax 调用的 URL。

<div class="element" data-url="data1.php"></div>
<div class="element" data-url="data2.php"></div>
<div class="element" data-url="data3.php"></div>
...

我需要通过 AJAX 加载他们的内容,并在完成后用它做一些事情。

我认为我不能使用 .ajaxStop(),因为在这些调用之后会有更多不同的 ajax 调用,我等不及它们都完成了。

所以我尝试使用 jQuery.when() 和 .each() 循环遍历所有元素并加载它们的内容,但是 .done() 函数在循环中的所有 ajax 调用完成之前触发。

$.when(
    $('.element').each(function() {
        var el = $(this);
        $.get($(el).data('url'), function(data) {
            $(el).html(data);
        });
    })
).done(function() {
    // do something after all calls are finished
});

最佳答案

您的逻辑问题在于 each() 返回一个 jQuery 对象。因为这不是 promise $.when() 会立即解析并且 done() 在所有/任何您的 $.get 之前被调用请求已完成。

要解决此问题,请从 $.get() 调用中创建一个 promise 数组,并将它们应用于 $.when()。试试这个:

var promises = $('.element').map(function() {
  var $el = $(this);
  return $.get($el.data('url'), function(data) {
    $el.html(data);
  });
}).get()

$.when.apply($, promises).done(function() {
  // do something after all calls are finished
});

另请注意,虽然这可行,但可能会在循环中用请求淹没您的服务器,这不是可扩展的解决方案。更好的模式是将 .element 元素中的所有 data-url 属性聚合到单个请求中,然后在此请求完成后手动更新 DOM。

关于javascript - Ajax jQuery.when() 与 each() 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57358862/

相关文章:

javascript - 有效地更改 Javascript 或 Node.js 中数组的大小

javascript - 克隆表单和增量 ID

javascript - 如何使用参数调用 live 方法

javascript - ajaxComplete 不触发以停止脚本

javascript - D3.js 在堆叠到分组条形图示例中通过修改后的 Lee Byron 测试算法生成器传递 CSV

javascript - 如何将 Underscore.js 模板与 EJS 结合使用?

javascript - 未捕获( promise )TypeError : Cannot read property 'NON_INDEXED_FIELDS' of undefined

javascript - 如何清空plupload队列

javascript - 强制在 Javascript 中为 UpdatePanel 回发?

javascript - 从 AJAX post 访问 C# Controller 中的表单数据