我需要在不锁定浏览器的情况下创建一系列N个Ajax请求,并且希望使用jQuery延迟对象来完成此操作。如何使用jquery链接ajax调用
这是一个带有三个请求的简单示例,但我的程序可能需要排队超过100个(请注意,这不是确切的用例,实际代码确实需要确保步骤(N-1)
$(document).ready(function(){
var deferred = $.Deferred();
var countries = ["US", "CA", "MX"];
$.each(countries, function(index, country){
deferred.pipe(getData(country));
});
});
function getData(country){
var data = {
"country": country
};
console.log("Making request for [" + country + "]");
return $.ajax({
type: "POST",
url: "ajax.jsp",
data: data,
dataType: "JSON",
success: function(){
console.log("Successful request for [" + country + "]");
}
});
}
下面是被写入到控制台(所有请求并行制成,如预期的响应时间是成正比的每个国家的数据的大小:
执行下一步)之前Making request for [US]
Making request for [CA]
Making request for [MX]
Successful request for [MX]
Successful request for [CA]
Successful request for [US]
我怎样才能得到延期对象把这些排队给我?我试着改变管道,但得到相同的结果。
下面是所期望的结果:
Making request for [US]
Successful request for [US]
Making request for [CA]
Successful request for [CA]
Making request for [MX]
Successful request for [MX]
编辑:
我感谢您的建议使用一个数组来存储请求参数,但jquery的推迟对象具有排队请求的能力和我真的很想学习如何充分利用这个功能。
这实际上是我想要做的事:
when(request[0]).pipe(request[1]).pipe(request[2])... pipe(request[N]);
不过,我想在指定时间的请求进入管道一步,以便有效地利用各遍历:
deferred.pipe(request[0]);
deferred.pipe(request[1]);
deferred.pipe(request[2]);
这个答案绝对有效,我试图消化所有它,因为它很复杂。谢谢! – Graham 2011-12-23 17:25:44
我想我现在看到了这个。我原来的代码和你的代码之间的主要区别似乎是你为每个请求创建了Deferred对象,我的试图使用一个Deferred对象。我对么? – Graham 2011-12-24 16:30:16
你的一些具体问题:(1)当你已经从ajax调用返回承诺时,你为什么明确地返回一个承诺? (2)为什么要把“这个”分配给“自我”? (3)为什么你不选择使用管道()时,这是本机jquery队列功能? (4)当我们为每个请求创建Deferred对象时,当我开始向“队列”中提供数百个请求时,内存要求是什么? Deferred对象有多轻量级? – Graham 2011-12-24 17:08:45