JavaScript: глобальные переменные после запросов Ajax

вопрос довольно прост и техничен:

var it_works = false;

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

     it_works = true;

});

alert(it_works); # false (yes, that 'alert' has to be here and not inside $.post itself)

Чего я хочу достичь:

alert(it_works); # true

Есть ли способ сделать это? Если не удается $.post() вернуть значение, которое будет применено к it_works?

+30
источник поделиться
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, вы можете указать, что запрос синхронный, что означает, что script будет продолжать работу только после завершения запроса.


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

$.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
// ...

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

Дуглас Крокфорд (Блог YUI)

+65
источник

AJAX означает асинхронный JavaScript и 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);

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

+4
источник
другие ответы

Связанные вопросы


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

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

+3
источник

Причина, по которой ваш код выходит из строя, заключается в том, что 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
источник

Посмотрите другие вопросы по меткам или Задайте вопрос