Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的javascript代码没有按正确的顺序执行_Javascript_Jquery_Ajax - Fatal编程技术网

我的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);
}