您期望的是同步(阻塞)类型的请求。
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 博客)