Ajax-вызов внутри циклаeach() не является асинхронным

StackOverflow https://stackoverflow.com/questions/1708389

Вопрос

То, что я пытаюсь сделать, включает в себя установку ряда флажков.

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

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

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

У меня сложилось впечатление, что если определить вызов как asynchronous=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);
Это было полезно?

Решение

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

,async: false

Чтобы вы передали логическое значение ЛОЖЬ, а не строка "ЛОЖЬ".Это должно сделать ваш вызов AJAX синхронным.

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

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top