2011-03-06 38 views
0

我是jQuery的超级新手,会喜欢一些我遇到的问题的帮助。它应该很简单。基本上,第一个警报是空的,但是当我第二次调用变量时,它会给出预期的结果。jQuery发布回复没有设置,直到第二次使用

$.post("showcolor.php", { color: "orange"}, 
    function(data) { 
    colorInfo = data; 
}); 
alert(colorInfo); //empty 
alert(colorInfo); //expected results 

有人可以向我解释这种现象吗?

回答

1

Ajax是异步的。这意味着请求在后台运行,而您的代码仍在运行。

success回调(function(data))将在请求完成时运行。在你的测试中,第5行的警报发生时就是这样,在执行第6行之前。

在较慢的连接上,需要更长的时间,第6行也会显示为空。请求完成时是完全随机的。

底线:将需要知道请求结果的任何代码放入success回调中。

+0

为什么downvote?有什么不对吗? – 2011-03-06 20:41:44

+1

注意:jQuery的post()函数只有一个回调函数,所以我认为如果你是jQuery的超级新手,那么“成功回调”可能有点混乱。如果在这种情况下的函数是ajax(),那将更加明显。 – Ivar 2011-03-06 20:48:41

0

AJAX请求异步,这意味着colorInfo = data的分配可能会比警报晚得多。

这是怎么一回事呢:

  1. $。员额启动异步AJAX请求,并立即长移到下一行是警报。
  2. 警报执行并打印出null,因为服务器尚未响应。
  3. 服务器响应并调用回调函数,并将colorInfo的值分配给AJAX调用的结果
  4. 调用下一个警报并打印正确的值。

当然,这一切都是非常随机的。如果服务器响应速度很快,则可能会得到第一个警报显示正确的值,而另一方面,如果服务器速度较慢,则两个警报可能会显示错误的值。

所以,正确的做法是把警报成功回调里面,因为它是唯一的里面,你都保证分配数据这个匿名函数:

$.post("showcolor.php", { color: "orange" }, function(data) { 
    alert(data); 
}); 
0

这是因为Ajax请求将完成大约与第一次警报同时发生;数据尚未返回。

将警报放入函数中,而不是在Ajax请求完成时执行。

相关问题