我需要在不鎖定瀏覽器的情況下創建一系列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