1

可能重复:
你如何让 javascript 代码*按顺序执行*

var cek = false;

function checkForm()
{
    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 == "")
                cek = true;
        }
    }); //---> 1

    return cek; //---> 2
}

我想问为什么“返回cek;” (第 2 部分)在 AJAXfunc(第 1 部分)之前执行?我想知道如何让它以正确的顺序执行。

谢谢你的帮助 !

4

4 回答 4

2

要了解您的问题,您需要了解异步方法。一个简单的谷歌会给你大量的阅读材料。我建议从这里开始:

精通 Ajax,第 2 部分:使用 JavaScript 和 Ajax 发出异步请求

提示:你现在所做的永远不会奏效——除非你选择使它成为一个同步函数(不推荐)。

于 2013-01-17T15:40:03.280 回答
0

那是因为 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
  }
});
于 2013-01-17T15:42:07.783 回答
0

Javascript 是异步的,因此像您这样的异步功能AJAXfunc在程序完成之前不会阻塞您的程序。这就是为什么在 javascript 中大量使用事件和回调的原因。

例如,您的带有回调的代码将类似于:

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.
} );
于 2013-01-17T15:42:38.633 回答
0

您最好重新构建代码以在收到响应时触发回调。

IE。1. 使 checkForm 有一个回调参数 2. 使用结果激活该回调 3. 将其余代码放在回调中,而不是跟随函数的返回

例如:

// before (wrong):
result = checkForm();
handleResult1(result);
handleResult2(result);

// after (correct):
checkForm(function(result) {
    handleResult1(result);
    handleResult2(result);
}
于 2013-01-17T15:44:34.227 回答