jQuery帖子响应直到第二次使用才设置

时间:2011-03-06 20:31:11

标签: jquery

我是jQuery的新手,并且非常喜欢我遇到的一个问题。它应该很简单。基本上,第一个警报是空的,但是当我第二次调用变量时,它会给出预期的结果。

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

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

4 个答案:

答案 0 :(得分:1)

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

请求完成后,success回调(function(data))将会运行。在您的测试中,在执​​行第6行之前,显示了第5行警报期间的情况。

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

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

答案 1 :(得分:0)

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

这是怎么回事:

  1. $ .post启动异步AJAX请求并立即移动到下一行,即警报。
  2. 警报执行并打印为null,因为服务器尚未响应。
  3. 服务器响应并调用回调函数,并将colorInfo的值分配给AJAX调用的结果
  4. 调用下一个警报并打印正确的值。
  5. 当然这一切都是随机的。如果服务器响应速度非常快,您可能会得到第一个警报显示正确的值,而另一方面,如果服务器速度很慢,则两个警报可能显示错误的值。

    所以正确的方法是将警报放在成功回调中,因为它只在这个匿名函数中,你可以保证分配数据:

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

答案 2 :(得分:0)

这是因为Ajax请求将与您的第一个警报同时完成;数据尚未归还。

将警报放在函数内部,这将在Ajax请求完成时执行。

答案 3 :(得分:0)

您可以firebugmozilla firefox一起使用来调试它并识别其工作原理。