【发布时间】:2011-12-23 06:24:42
【问题描述】:
我需要在不锁定浏览器的情况下发出一系列N个ajax请求,并且想使用jquery deferred object来完成。
这里是一个简化的例子,有三个请求,但是我的程序可能需要排队超过 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]
如何让延迟对象为我排队?我尝试将 done 更改为 pipe 但得到相同的结果。
这是想要的结果:
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]);
【问题讨论】:
标签: jquery ajax jquery-deferred deferred