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

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

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

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

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

В «параллельном режиме» с двумя запросами я хочу получить такой результат:

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

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 16 марта 2011

Самый простой способ выполнить ваш запрос 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();

См. DEMO .

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

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

1 голос
/ 17 марта 2011

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

  1. jQuery Отложено не работает
  2. jQuery. При понимании

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

0 голосов
/ 15 марта 2011

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

...