【问题标题】:An array of ajax requests from a single request来自单个请求的 ajax 请求数组
【发布时间】:2016-06-28 21:01:39
【问题描述】:

我有一个奇怪的 ajax 场景,我无法理解。

这是我试图协调的事件序列:

  1. 单个请求会返回一个 ID 号数组。
  2. 对于每个 ID,都会发送一个新请求。
  3. 当所有这些请求都返回后,它们的数据就会被收集和呈现。

看起来很简单,但我不知道如何表达。

我对链接延迟对象的理解是它们都被立即实例化,然后数据在它们被解析时流过它们。但是当其中一个项目是一个数组,可能大小为零时,这是如何工作的呢?

我知道我需要 $.when().apply() 来观察响应数组。

我想也许我需要一个以某种方式代表数组的延迟对象,但我不知道如何表达这一点。

【问题讨论】:

    标签: javascript jquery arrays ajax jquery-deferred


    【解决方案1】:

    老实说,这听起来像是一个不好的模式,因为您有 N+1 个请求都被触发。如果您在阵列中有很多项目和/或很多用户,您最终可能会对您自己的服务器进行 DDOS。

    因此,更好的做法是更改点 2 以便在单个请求中发送所有 id,或者甚至更改点 1 以从具有给定 id 的元素返回所有必需的数据。

    话虽如此,您可以通过将 jQuery 的 AJAX 方法返回的承诺保存到数组中,然后将其应用于 $.when() 来实现您的要求,如下所示:

    $.ajax({
        url: '/endpoint1',
        data: { foo: 'bar' },
        success: function(data) {  
            var requests = [];
            for (var i = 0; i < data.ids.length; i++) {
                requests.push(
                    $.ajax({           
                        url: '/endpoint2'
                        data: { id: data.ids[i] }
                    })
                );
            }
    
            $.when.apply($, requests).done(function() { 
                // do something when all AJAX requests have completed here...
            });
        }
    });
    

    【讨论】:

    • 谢谢!效果很好,只做了一些小的改动,我想我对这个异步的东西有了更好的处理。我可以理解为什么这种安排是有问题的,但我被一些有限的 API 卡住了。幸运的是,它只适用于少数内部用户,涉及的 id 不应该超过十几个。
    • 没问题,很高兴为您提供帮助。为不准确表示歉意....已经晚了;)很高兴你得到了正确的语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    相关资源
    最近更新 更多