Как создать цепочку ajax-запросов с помощью jquery

Мне нужно сделать серию из 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]);
33
задан George Stocker 30 May 2014 в 16:54
поделиться