关于jquery:JavaScript:Ajax请求之后的全局变量

JavaScript: Global variables after Ajax requests

本问题已经有最佳答案,请猛点这里访问。

这个问题相当简单和技术性:

1
2
3
4
5
6
7
8
9
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)

我想要实现的是:

1
alert(it_works); # true

有办法吗?如果不是,那么$.post()能否返回一个要应用于it_works的值?


您期望的是同步(阻塞)类型的请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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可以选择将请求设置为同步,这意味着脚本只能在请求完成后继续运行。

但是,建议的方法是重构代码,以便在请求完成后将数据传递给回调函数。这是首选的,因为阻塞执行意味着阻塞不可接受的UI。这样做:

1
2
3
4
5
6
7
8
9
10
11
$.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
// ...

Asynchronous programming is slightly more complicated because the consequence
of making a request is encapsulated in a function instead of following the request statement. But the realtime behavior that the user experiences can be significantly
better because they will not see a sluggish server or sluggish network cause the
browser to act as though it had crashed. Synchronous programming is disrespectful
and should not be employed in applications which are used by people.

道格拉斯·克罗克福德(Yui博客)


Ajax代表异步JavaScript和XML。因此,发送到服务器的日志与函数的其余部分不同步。尝试使用类似这样的代码(它只是将简写的$.post分解为较长的$.ajax调用,并添加async选项)。

1
2
3
4
5
6
7
8
9
10
11
var it_works = false;

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

alert(it_works);

希望这有帮助!


似乎您的问题只是一个并发问题。post函数接受一个回调参数,告诉您何时完成了post。您不能在这样的全局范围内发出警报,并期望已完成发布。您必须将它移到回调函数。


代码失败的原因是post()将启动对服务器的异步请求。对您来说,这意味着post()会立即返回,而不是在请求完成之后,如您所期望的那样。

那么,您需要的是使请求同步,并阻塞当前线程,直到请求完成。因此,

1
2
3
4
5
6
7
8
9
10
11
var it_works = false;

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

alert(it_works);