2016-03-13 67 views
2

我有一个特殊的ajax场景,我无法将头包裹起来。来自单个请求的ajax请求数组

这是活动的,我想,统筹序列:

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

这似乎很简单,但我无法弄清楚如何表达它。

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

我知道我将需要$。当()。适用(),看响应的阵列进来。

我想,也许我需要一个单一的延迟对象,不知怎的,站在了数组,但我无法弄清楚如何表达这一点。

回答

3

说实话,这听起来像一个不好的模式,因为你有N + 1个请求被解雇。如果阵列中有很多项目和/或许多用户,则可能会导致DDOSing您自己的服务器。

因此,更改点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... 
     }); 
    } 
}); 
+0

谢谢!这很好,只需稍作修改,我认为我可以更好地处理这种异步的问题。 我可以看到为什么这种安排有问题,但我坚持一个有限的API。幸运的是,它只适用于少数内部用户,并且不应该涉及十几个ID。 –

+0

没问题,很高兴帮助。对不准确的道歉......它迟了;)很高兴你得到了正确的语法。 –