Мне нужно сделать серию из 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]
Edit:
Я ценю предложение использовать массив для хранения параметров запроса, но отложенный объект 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]);