我需要在不锁定浏览器的情况下发出一系列 N ajax 请求,并希望使用 jquery deferred 对象来完成此操作。
这是一个包含三个请求的简化示例,但我的程序可能需要排队超过 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 deferred 对象能够对请求进行排队,我真的很想学习如何充分利用这个功能。
这实际上是我正在尝试做的事情:
when(request[0]).pipe(request[1]).pipe(request[2])... pipe(request[N]);
但是,我想一次将请求分配到管道中,以便有效地使用每个遍历:
deferred.pipe(request[0]);
deferred.pipe(request[1]);
deferred.pipe(request[2]);