Как управлять очередями 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?
посмотреть этот комментарий on .when () метод из отложенных функций AJAX