3

首先,我声明了一个全局变量并将其设置为 0。
在内部函数中,我想将 var 设置为另一个值,但我的输出不会在(全局)外部 var 中设置,它将被设置为本地变种。我的另一个问题是我得到输出的顺序。

输出:
第三
个0第一个0
第二个3

$(document).ready(function() {
    state = 0;
    $('#btnlogin').click(function() {
        $.post("php/redirect.php", {
            Username : $('#qi').attr('value'),
            Password : $('#password').attr('value')
        }, function(data) {
            console.log('first'+state);
            state = 3;
            console.log('second'+state);
        });
        console.log('third'+state);
    });
});
4

3 回答 3

1

发生这种情况是因为console.log('third'+state);外部$.post(AJAX)调用并且调用速度比 ajax 响应快。

似乎您误解了 AJAX 是异步的。

于 2012-05-10T12:24:51.027 回答
1

您的问题是,当 post 调用从服务器返回时,调用的内部函数$.post将首先运行。

因此,当单击按钮时,您的程序流程将如下所示:

$.post("php/redirect.php",这将调用服务器端的redirect.php方法,并在调用完成时调用以下函数:

function(data) {
  console.log('first'+state);
  state = 3;
  console.log('second'+state);
}

然后该函数继续并运行以下代码:

console.log('third'+state);

此时状态仍为 0,因此输出为third0

然后 ajax 调用完成,并调用你上面的函数,从而打印以下内容:

first0
second3

您的问题只是期望方法中的行,包括您在内部定义的函数以它们在脚本中出现的相同顺序运行。

于 2012-05-10T12:28:30.603 回答
0

输出很容易解释:

加载文档后,您首先将单击处理程序绑定到某个按钮。点击处理程序以下列方式工作:

  • 启动异步AJAX 调用
  • 注销'third'+state

此时状态为 0,因此第一个输出为third0

一段时间后,AJAX 请求成功,您得到了答案。得到答案时,您会登录'first'+statestate仍然可以得到0输出first0

之后,您将 的值更改state为三和第三个输出,这将为您提供second3.

因此,要了解行为,您应该熟悉 AJAX 的异步版本或将请求更改为同步样式。后者非常糟糕,因为它会使您的页面在请求仍在运行时无法访问。

于 2012-05-10T12:28:44.723 回答