Как управлять очередями ajax-запросов в jquery 1.5?
Я тестировал новые отложенные функции AJAX в jquery 1.5 и впечатлен их простотой и мощью. Есть более важный вопрос, который я связал с лучшим способом поставить эти запросы в очередь.
У меня есть два сценария: последовательный и параллельный, если хотите. Я хочу избежать терминов sync / async, потому что я хочу, чтобы все они были асинхронными запросами, чтобы пользователь мог выполнять другие действия в ожидании обработки очереди. Затем я хочу вызвать одну функцию, когда очередь завершила обработку.
В "последовательном режиме" с двумя запросами я бы хотел, чтобы они обрабатывались следующим образом:
RequestA -> ResponseA -> RequestB -> ResponseB -> EndOfQueue
В "параллельном режиме" с двумя запросами я хочу такой результат:
RequestA -> RequestB (ResponseA, ResponseB обрабатывается всякий раз, когда готов) -> EndOfQueue
В любом случае, если какой-либо запрос завершится неудачно, я бы хотел, чтобы очередь остановилась и передала управление функции сбоя.
У меня есть требования, которые определяют динамическую длину очереди, поэтому я не думаю, что смогу просто связать кучу отложений.then() или.when() вместе, так как не буду знать, один это или сто элементов, Я выполняю бизнес-логику на сервере через 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?
Пожалуйста, обратитесь к двум вопросам, которые я задал
Надеюсь, вы сможете понять концепцию.
Смотрите этот комментарий о методе.when() из отложенных функций AJAX.