Как обнаружить запущенный асинхронный вызов AJAX и поставить еще один в очередь в jQuery?

У меня есть приложение PhoneGap на Android с использованием jQuery. Иногда мне нужно загрузить больший объем данных, используя $.post асинхронно, чтобы данные отправлялись в фоновом режиме. Это работает нормально, но при более медленном соединении это занимает некоторое время. Я обнаружил, что запуск другого асинхронного вызова AJAX приведет к прерыванию первого вызова.

Есть ли способ определить, выполняется ли какой-либо асинхронный AJAX, и если ДА, то как поставить еще один асинхронный вызов AJAX в очередь и запустить его, когда первый завершится?


person Frodik    schedule 24.06.2011    source источник
comment
вы не можете просто поместить второй вызов ajax в функцию обратного вызова первого успеха?   -  person Ben    schedule 24.06.2011
comment
Ну, это была моя первая мысль, однако в моей ситуации это не совсем возможно, поэтому я ищу другое решение, если оно существует.   -  person Frodik    schedule 24.06.2011
comment
jQuery.queue() не поддерживается?   -  person planestepper    schedule 24.06.2011


Ответы (2)


Другим вариантом было бы сохранить ссылку на объект jqXHR, а затем вы можете вызвать полный метод, чтобы увидеть, завершился ли он.

var jqXHR = $.post(url,data,function()
{

}); 

if(jqXHR.complete())
{
    //do second call
}

Все вышеперечисленное обсуждается на справочной странице http://api.jquery.com/jQuery.post/

Вы можете поработать над этим и добавить таймер. Затем, если это не завершено, просто установите таймер на несколько секунд и снова проверьте, завершено ли оно.

person Ben    schedule 24.06.2011

Что касается обнаружения выполняемого асинхронного запроса AJAX, вы можете использовать некоторую переменную, которая инициализируется некоторым значением при запуске вызова и устанавливается в другое значение, когда вызов завершается.

Во второй части, если эта конкретная переменная не была установлена, добавьте вызов функции в некоторую очередь, которую вы обрабатываете с помощью обработчика события ajaxComplete. В качестве альтернативы передайте обратный вызов через .complete(), который делает что-то в этом роде.

person Steve Wang    schedule 24.06.2011