JavaScript: Глобальные переменные после запросов Ajax [дубликат]

48
задан gblazex 11 July 2010 в 15:09
поделиться

4 ответа

То, что вы ожидаете, это синхронный (блокирующий) тип запроса.

var it_works = false;

jQuery.ajax({
  type: "POST",
  url: 'some_file.php',
  success: function (data) {
    it_works = true;
  }, 
  async: false // <- this turns it into synchronous
});​

// Execution is BLOCKED until request finishes.

// it_works is available
alert(it_works);

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

Теперь, с помощью jQuery.ajax вы можете опционально установить запрос на синхронный, что означает, что скрипт продолжит выполнение только после завершения запроса.


Однако РЕКОМЕНДУЕМЫЙ способ - это рефакторинг вашего кода таким образом, чтобы данные передавались в функцию обратного вызова сразу после завершения запроса. Это предпочтительнее, поскольку блокировка выполнения означает блокировку пользовательского интерфейса, что неприемлемо. Сделайте это так:

$.post("some_file.php", '', function(data) {
    iDependOnMyParameter(data);
});

function iDependOnMyParameter(param) {
    // You should do your work here that depends on the result of the request!
    alert(param)
}

// All code here should be INDEPENDENT of the result of your AJAX request
// ...

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

Douglas Crockford (YUI Blog)

90
ответ дан 26 November 2019 в 18:42
поделиться

AJAX расшифровывается как Asynchronous JavaScript and XML. Таким образом, отправка сообщения на сервер происходит не синхронно с остальной частью функции. Попробуйте вместо этого код, подобный этому (он просто разбивает сокращение $.post на более длинный вызов $.ajax и добавляет опцию async).

var it_works = false;

$.ajax({
  type: 'POST',
  async: false,
  url: "some_file.php",
  data: "",
  success: function() {it_works = true;}
});

alert(it_works);

Надеюсь, это поможет!

6
ответ дан 26 November 2019 в 18:42
поделиться

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

5
ответ дан 26 November 2019 в 18:42
поделиться

Причина неудачи вашего кода заключается в том, что post() запускает асинхронный запрос к серверу. Для вас это означает, что post() возвращается немедленно, а не после завершения запроса, как вы ожидаете.

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

var it_works = false;

$.ajax({
  url: 'some_file.php',
  async: false,  # makes request synchronous
  success: function() {
    it_works = true;
  }
});

alert(it_works);
2
ответ дан 26 November 2019 в 18:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: