Как управлять очередями ajax-запросов в jquery 1.5?

Я тестировал новые отложенные функции AJAX в jquery 1.5 и впечатлен их простотой и мощностью. Есть большой вопрос, который я связал с лучшим способом очереди этих запросов.

У меня есть два варианта: последовательный и параллельный, если угодно. Я хочу избежать условий синхронизации/асинхронности, потому что я хочу, чтобы все это были асинхронные запросы, чтобы пользователь мог выполнять другие действия во время ожидания обработки очереди. Затем я хочу назвать сингл функция, когда очередь завершила обработку.

в "последовательном режиме", имея два запроса, я бы хотел, чтобы они обрабатывались следующим образом:

RequestA - > ResponseA - > RequestB - > ResponseB - > EndOfQueue

в "параллельном режиме" с двумя запросами я хочу этот результат:

RequestA - > RequestB (ResponseA, ResponseB обрабатывается, когда готов) - > EndOfQueue

в любом случае, если какой-либо запрос не будет хотите, чтобы очередь остановилась и передала управление функции сбоя.

У меня есть требования, которые определяют динамическую длину очереди, поэтому я не думаю, что смогу просто связать кучу .затем () или .когда () откладывает вместе, так как я не буду знать, один или сто элементов. Я выполняю бизнес-логику на сервере через API поставщика, поэтому пакетирование на стороне сервера будет затруднено, поскольку у меня нет контроля над этим кодом.

Я построил тестовые случаи, которые выполняют" параллельный " случай и вызовите функцию when () после успешного завершения, но эти тесты не являются динамическими по длине очереди и не переносятся в последовательную модель.

Я вижу, как я мог бы создать пользовательский объект очереди для обработки этого, но кажется, что все части уже написаны для меня в jquery (?). Я посмотрел, но не нашел примера, который охватывает последовательные запросы таким образом.

любые мысли о том, как справиться с этим с помощью очереди jquery / отложено функциональность?

3 ответов


самый простой способ достичь вашего RequestA - > ResponseA - > RequestB - > ResponseB заказ будет использовать что-то вроде этого:

var queue = [];

function qNext() {
    $.ajax(queue.shift()).success(qNext);
}

function qAjax(options) {
    queue.push(options);
}

qAjax({
    // $.ajax options
});

qAjax({
    // $.ajax options
});

qNext();

посмотреть демо.

Это несколько упрощенная версия ваших требований, но было бы легко добавить обратный вызов для запуска после того, как очередь пуста.

вы уверены, что не хотите порядок RequestA -> RequestB -> ResponseA -> ResponseB?


пожалуйста, обратитесь к двум вопросам, которые я задавал

  1. jQuery отложено не работает
  2. С помощью jQuery.когда понимание

надеюсь, вы сможете понять концепцию.


посмотреть этот комментарий on .when () метод из отложенных функций AJAX