ExtJS 4 - Как проверить, все ли текущие запросы Ajax выполнены, а затем выполнить действие? - PullRequest
2 голосов
/ 19 ноября 2011

У меня есть страница, которая запускает запросы Ajax для проверки на стороне сервера. Мне нужно выполнить действие, когда все запросы ajax закончили загрузку или были завершены.

Для этого я использую Ext.Ajax.isLoading () в рекурсивной функции следующим образом:

function chechValid(){
    if(Ext.Ajax.isLoading()){
        checkValid();
    }else{
        //Code for Action 1
    }
}//EOF

checkValid();

//Code for Action 2

Проблема в том, что при этом браузеры выдают следующие ошибки:

Mozill FF - слишком много рекурсий

IE - переполнение стека в строке: 18134

Если эта рекурсия тяжелая вещь для браузеров, то как выполнить задачу, когда все запросы Ajax закончили загрузку?

Использование задержки - это не то, что я хочу, поскольку, если используется задержка, браузер начинает выполнять другой код (например, «Код для действия 2», как описано выше), который не является ожидаемым.

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

Любые предложения / помощь по этому вопросу?

Заранее спасибо.

PS: использование ExtJs 4.0.7

(Обновлено) Подробнее о реальной ситуации: -

Вот краткое описание ситуации: существует форма, в которой мне нужно выполнить проверки на стороне сервера в различных областях. Я делаю это, запуская запрос ajax на событие размытия. В зависимости от ответа сервера проверки Ajax, запущенного при размытии, поля помечаются как недействительные, и отправка формы не допускается. (Предотвращение события «изменение», поскольку оно приводит к значительным накладным расходам на сервере из-за большого количества запросов Ajas, а также приводит к колебательным воздействиям на поле при получении ответа от различных таких запросов Ajax).

Все работает хорошо, за исключением одного случая - когда пользователь изменяет значение поля и вместо «табуляции» из поля он непосредственно нажимает кнопку «Сохранить». В этом случае, однако, событие размытия запускается, но обработка «Сохранить» не ожидает ответа Ajax Validation и отправляет форму. Таким образом, мне как-то нужно проверить, закончили ли Ajax-запросы загрузку и сохранили ли форму. requestComplete, к сожалению, не будет служить цели здесь. И если попытаться использовать рекурсию, то, конечно, браузер зависает из-за высокого использования ресурсов. То же самое происходит, если я пытаюсь использовать обходной сценарий паузы (как здесь указано - Javascript Sleep ).

Есть ли возможный обходной путь для этого?

ТИА

Ответы [ 3 ]

2 голосов
/ 19 ноября 2011

Ваш метод приведет к бесконечной рекурсии.

Лучший способ - зарегистрировать функцию обратного вызова в Ext.Ajax.requestcomplete, что-то вроде этого (не проверено):

Ext.Ajax.on('requestcomplete', function(conn, response, options) {
   if (!Ext.Ajax.isLoading()) {
      //your action...
   }
}

};

1 голос
/ 06 января 2012

Если я не пойму проблему, вы не сможете создать пару глобалов. Я знаю, что глобальные перемены плохие, но в этом случае это избавит вас от головной боли. Один глобальный будет "formReady" и первоначально установить его в ложь, другой будет "ajaxActive" и установить в ложь. Вы также добавили бы метод onSubmit, который проверял бы, что «formReady» был истинным, и если не предупреждал пользователя о том, что проверка прошла (или вы могли бы снова установить тайм-аут для отправки формы и иметь вторую проверку, которая проверяет, является ли «ajaxActive») правда). Когда AJAX-вызов сделан, он установит для переменной "ajaxActive" значение true, а после завершения установит для свойства formReady значение true. Вы также можете потенциально повторно отправить форму автоматически, если ответ от AJAX был о том, что форма в порядке.

0 голосов
/ 23 ноября 2011

Ext.Ajax.request () возвращает объект транзакции при его вызове, который является уникальным и позволяет распознавать и прерывать определенные запросы Ajax.

Просто вызывая Ext.Ajax.isLoading () без указанного объекта транзакции, он по умолчанию обращается к последнему запросу, поэтому вы должны вызывать его рекурсивно в данный момент.

Если бы это был я, я бы создал массив этих объектов транзакций при их запуске и передал бы каждый из них в качестве необязательных параметров в функцию Ext.Ajax.isLoading (), чтобы проверить, имеет ли конкретный запрос законченный. Если это так, вы можете удалить этот объект транзакции из массива и выполнять сохранение только тогда, когда ваш массив пуст.

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

...