小编典典

JavaScript:Ajax请求后的全局变量

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


阅读 437

收藏
2020-07-26

共1个答案

小编典典

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

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您可以选择将请求设置为 sync
,这意味着脚本将仅在请求完成 继续运行。


建议的 方式,但是,是 重构 代码,以便数据将被传递到一个 回调
函数,一旦请求完成。这是优选的,因为阻止执行意味着阻止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
// ...

异步 编程稍微 复杂一些, 因为发出请求的结果被封装在一个函数中,而不是遵循请求语句。 但是用户体验
到的实时行为可能会 大大改善, 因为他们不会看到缓慢的服务器或缓慢的网络导致浏览器像崩溃一样运行。 同步 编程是 不礼貌的
不应 在人们 使用 的应用程序中使用。

道格拉斯·克罗克福德 YUI博客

2020-07-26