$(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);
});
});
首先,我声明了一个全局变量并将其设置为0。
在内部函数中我想将var设置为另一个值,但是我的输出不会在(全局)外部var中设置,它将被设置为本地var。我的另一个问题是我获得输出的顺序。
输出:
third0<br>
first0<br>
second3<br>
答案 0 :(得分:1)
这是因为console.log('third'+state);
在$.post
(AJAX)调用之外并且调用比ajax响应更快。
似乎你误解了AJAX 异步。
答案 1 :(得分:1)
问题是当邮件调用从服务器返回时,$.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
你的问题只是期望你方法中的行,包括你在里面定义的函数以它们在你的脚本中出现的顺序运行。
答案 2 :(得分:0)
输出很简单:
加载文档后,首先将点击处理程序绑定到某个按钮。点击处理程序以下列方式工作:
'third'+state
此时状态为0,因此第一个输出为third0
。
一段时间后,AJAX请求成功了,你得到了答案。得到答案时,请记录'first'+state
。如果state
仍为0
,则会获得输出first0
。
之后,您将state
的值更改为3,并将第三个输出更改为second3
。
因此,要了解行为,您应该熟悉AJAX的异步版本或将请求更改为同步样式。后者非常糟糕,因为它会在请求仍在运行时使您的页面无法访问。