我的javascript代码没有按正确的顺序执行
可能重复:我的javascript代码没有按正确的顺序执行,javascript,jquery,ajax,Javascript,Jquery,Ajax,可能重复: 我想问为什么在AJAXfunc(第1部分)之前执行“return cek;”(第2部分)?我想知道如何以正确的顺序执行 谢谢你的帮助 要理解您的问题,您需要理解异步方法。一个简单的谷歌会给你提供大量的阅读材料。我建议从这里开始: 提示:您现在所做的将永远不会起作用,除非您选择使其成为同步函数(不推荐)。这是因为AJAX调用是异步的 AJAXfunc调用在return语句之前执行,但稍后将调用您在AJAXfunc调用中提供的匿名函数 使回调在return语句之前运行的方法是使AJA
我想问为什么在AJAXfunc(第1部分)之前执行“return cek;”(第2部分)?我想知道如何以正确的顺序执行
谢谢你的帮助 要理解您的问题,您需要理解异步方法。一个简单的谷歌会给你提供大量的阅读材料。我建议从这里开始:
提示:您现在所做的将永远不会起作用,除非您选择使其成为同步函数(不推荐)。这是因为AJAX调用是异步的
AJAXfunc
调用在return
语句之前执行,但稍后将调用您在AJAXfunc
调用中提供的匿名函数
使回调在return
语句之前运行的方法是使AJAX调用同步。然而,这并不是一个好主意,因为这会使浏览器在等待响应时冻结
通常的处理方法是在checkForm
函数中使用回调:
function checkForm(callback) {
var user = document.forms["LoginForm"]["user"].value;
var pwd = document.forms["LoginForm"]["pwd"].value;
AJAXfunc("checkidpass.php?id="+user+"&pass="+pwd,function() {
if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200)) {
$("#LoginRes").html(xmlhttp.responseText);
callback(xmlhttp.responseText == "");
}
});
}
用法:
checkForm(function(cek) {
if (cek) {
// ok
} else {
// not ok
}
});
Javascript是异步的,所以像您这样的异步函数在程序完成之前不会阻塞程序。这就是javascript中大量使用事件和回调的原因 e、 g.带有回调的代码如下所示:
function checkForm(callback)
{
var user = document.forms["LoginForm"]["user"].value;
var pwd = document.forms["LoginForm"]["pwd"].value;
AJAXfunc("checkidpass.php?id="+user+"&pass="+pwd,function()
{
if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200))
{
$("#LoginRes").html(xmlhttp.responseText);
if (xmlhttp.responseText == "")
return callback(true);
}
return callback(false);
});
}
checkForm( function (result) {
var cek = result;
// Rest of your code for manipulating DOM or something else where you need cek.
} );
您最好重新构造代码,以便在收到响应时触发回调 即。 1.使checkForm具有回调参数 2.用结果激活该回调 3.将其余代码放在回调中,而不是在函数返回之后 例如:
// before (wrong):
result = checkForm();
handleResult1(result);
handleResult2(result);
// after (correct):
checkForm(function(result) {
handleResult1(result);
handleResult2(result);
}
“AJAX”中的第一个“A”代表异步。你知道如何使它按正确的顺序执行吗?Thanks@darkstallion如果您不确定如何考虑它,可以像
window.setTimeout
那样考虑它,您不知道ms
的值。它已经按正确的顺序执行了。在异步系统中不可能这样构造代码。我想我需要更多地了解异步系统。我以前从未在异步系统中编写过代码。感谢您的帮助提示:即使您将AJAXfunction
s第三个参数修改为false
,您现在所做的也永远不会起作用:o@PaulS.,我认为最好避免同步与异步的讨论,并将OP指向可以说明问题根本原因的资源。然而,根据你的评论,我已经更新了我的提示。不过,我最初的说法是正确的,他们现在所做的永远不会起作用。@JamesHill感谢链接:dw如果xmlhttp.readyState!=4
?您的回拨将永远不会被调用@德林切夫:是的,原始代码中也没有处理这种状态。结果将是(如果它工作的话)变量将是未定义的。是的,它将是未定义的,但是您的checkForm(函数(cek){if(cek){//ok}else{//this将永远不会被调用})代码>对吗?@drinchev:是的,会的。如果服务器返回的结果不是空结果,则将调用它。只有当服务器调用失败时才会调用回调,因为AJAX代码不会处理错误。
// before (wrong):
result = checkForm();
handleResult1(result);
handleResult2(result);
// after (correct):
checkForm(function(result) {
handleResult1(result);
handleResult2(result);
}