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

Gal*_*Gal 48 javascript ajax jquery global synchronous

问题相当简单和技术性:

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)
Run Code Online (Sandbox Code Playgroud)

我想要实现的是:

alert(it_works); # true
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?如果没有可以$.post()返回要应用的值it_works

gbl*_*zex 90

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

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);
Run Code Online (Sandbox Code Playgroud)

默认情况下,请求是异步(非阻塞),这意味着浏览器不会等待它们完成以继续其工作.这就是你的警报错误结果的原因.

现在,jQuery.ajax您可以选择将请求设置为同步,这意味着脚本将仅在请求完成继续运行.


推荐的方式,但是,是重构代码,以便数据将被传递到一个回调,一旦请求完成的功能.这是优选的,因为阻塞执行意味着阻止UI是不可接受的.这样做:

$.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
// ...
Run Code Online (Sandbox Code Playgroud)

异步编程稍微复杂一些,因为发出请求的结果封装在函数中而不是跟在请求语句之后.但是用户体验的实时行为可以明显更好,因为他们不会看到缓慢的服务器或缓慢的网络导致浏览器表现得好像已经崩溃.同步编程是不尊重的 ,不应该在人们使用的应用程序中使用.

Douglas Crockford (YUI博客)

  • 但请注意,如果`some_file.php`执行很多(昂贵的)操作,这将会破坏可用性. (3认同)
  • @galambalazs:不推荐使用同步请求,标准知道使用它们会引发错误。 (2认同)

mat*_*sta 6

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);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


Hos*_*Aly 5

看来您的问题仅仅是并发问题。post函数使用一个回调参数来告诉您何时完成发布。您无法在这样的全局范围内发出警报,并且期望该帖子已经完成。您必须将其移至回调函数。