Мне нужно сделать серию N запросов ajax без блокировки браузера, и вы хотите использовать объект отложенных jquery для выполнения этого.
Вот упрощенный пример с тремя запросами, но моей программе может потребоваться очередь более 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]
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]);