61

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

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

4

4 回答 4

105

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

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,这是不可接受的。这样做:

$.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 博客

于 2010-07-11T08:22:16.260 回答
7

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);

希望这可以帮助!

于 2010-07-11T08:23:47.620 回答
5

看来您的问题只是一个并发问题。post 函数接受一个回调参数来告诉您帖子何时完成。您不能像这样在全局范围内发出警报并期望帖子已经完成。您必须将其移至回调函数。

于 2010-07-11T08:19:20.670 回答
4

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

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

var it_works = false;

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

alert(it_works);
于 2010-07-11T09:19:42.847 回答