Ajax Call внутри цикла each () не является асинхронным - PullRequest
1 голос
/ 10 ноября 2009

То, что я пытаюсь сделать, - это пройти через серию флажков.

Для каждого из них, для которого это проверено, я должен выполнить некоторые вычисления (используя вызов ajax). Если есть ошибка, я должен разорвать цикл и вернуть сообщение.

Каждый ajax-вызов занимает около 0,4 секунды, но это никогда не будет проблемой, потому что я могу проверить только 4 из них в любой момент времени.

Но проблема, с которой я сталкиваюсь, заключается в том, что всплывающее окно с последним предупреждением всплывает перед тем, которое внутри функции error (). Функция ошибок работает, но она всегда появляется после последней.

У меня сложилось впечатление, что при определении вызова как асинхронного = false выполнение кода будет ждать, пока вызов вернет ответ. Это неправильное предположение?

Есть ли способ сделать это?

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

$("input[id*='chk_aut']").each(function() {
  if(this.value=="on") {
    $.ajax({
      type: "GET",
      url: "testpage.asp",
      cache:"false",
      async:"false",
      data: "which=checkvalues&value="
          + i_value
          + "&ref="+$("#cb_ref").val()
          + "&nif="+$("#txt_nif").val()
          + "&day="+i_day
          + "&month="+i_month
          + "&hours="+i_hours
          + "&year="+i_year + "&ms="
          + new Date().getTime(),
      success: function(msg) {
        //do something but continue the loop
      },
      error: function() {
        i_result =false;
        alert("An error has occurred");
        return false;//break the  loop
      }
    });
  }
});
alert(i_result);

Ответы [ 4 ]

7 голосов
/ 10 ноября 2009

Я думаю, вам нужно использовать

,async: false

Так что вы передаете логическое значение false , а не строку "false" . Это должно сделать ваш AJAX-вызов синхронным.

См. этот вопрос для аналогичной ситуации и некоторых дополнительных деталей. В частности, вы можете обнаружить, что для синхронных вызовов AJAX вы не можете использовать обработчик успеха и должны возвращать результаты после завершения вызова (вы находитесь вне области действия самого вызова AJAX).

Если это вообще возможно, вы должны попытаться реструктурировать свой код, чтобы он мог работать асинхронно. Синхронное выполнение плохо транслируется в браузер.

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

6 голосов
/ 10 ноября 2009

Как упомянуто в руководстве , функция error ...

Функция, вызываемая в случае сбоя запроса.

То есть, если есть проблема со связью между клиентом и сервером (например: таймаут, отсутствие авторизации и т. Д.). Он не вызывается, когда ваш серверный скрипт возвращает значение, которое в вашем приложении считается ошибкой. Переместите этот код в success и проверьте данные ответов, чтобы увидеть, как ваш скрипт обрабатывал каждый запрос.

Кроме того, я должен отметить, что у вас должны быть действительно веские причины для использования синхронных вызовов. Да, в вашем тестировании это займет всего 1,5 секунды, но что произойдет, если у кого-то медленное соединение, или ваш сервер находится под большой нагрузкой или недоступен? Синхронные запросы замораживают браузер клиента (т. Е. Даже такие вещи, как смена вкладок или прокрутка), что создает очень плохой пользовательский опыт. Если вы хотите заблокировать пользовательский интерфейс на своей странице, есть множество более удобных способов сделать это. Например, проверьте BlockUI .

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

4 голосов
/ 21 сентября 2010

Используйте async:false вместо async:"false" и наслаждайтесь.

0 голосов
/ 10 ноября 2009

Я не знаком с опцией async в вызове ajax. Я успешно использую jQuery Ajax Manager для ситуаций, когда мне нужны синхронные вызовы ajax: http://plugins.jquery.com/project/AjaxManager

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...