代码执行是否等待Ajax响应?

时间:2013-07-11 20:11:01

标签: javascript ajax global-variables timing

基本上我有

correctData = false//global variable
function calledFirst()
{
        xmlhttp.onreadystatechange=function()
        {
            if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
            {

                proceedDiv.innerHTML = xmlhttp.responseText
                if(xmlhttp.responseText == "You may continue.")
                    correctData = true
                else
                    correctData = false
            }
        }
        xmlhttp.open("GET", "process.php?proposed="+encodeURIComponent(mon2),true);
        xmlhttp.send()
        calledSecond()
}
function calledSecond()
{
    if(!correctData)
    {
     //uh-oh

似乎在Ajax响应完成之前调用calledSecond(),这是一个问题,因为correctData的值取决于Ajax响应,而calleSecond使用它。我怎么能这样做?

更新:如果我将函数调用放入回调部分,那么每个人都是正确的但是为什么它有效?您只是说服它不起作用,因为Ajax是异步的,所以其余的代码不等待Ajax完成,那么为什么要将它移到回调部分来解决这个问题?

2 个答案:

答案 0 :(得分:2)

这就是AJAX异步的原因。在编译页面的其余部分之前,编译器不会等待AJAX​​调用完成。

如果你希望第二次调用calledSecond(),你必须将它放入一个回调函数。

答案 1 :(得分:2)

这种情况正在发生,因为Ajax请求是以异步处理的。基本上,代码的其他部分将在处理请求时运行。如果您有一个依赖于响应的函数,请将其放入回调中。这将确保在请求完成之前不调用该函数,因为只有在满足请求(readyState == 4status == 200)后才会运行该回调。它看起来像这样:

    xmlhttp.onreadystatechange=function()
    {
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
        {
            proceedDiv.innerHTML = xmlhttp.responseText
            if(xmlhttp.responseText == "You may continue.")
                correctData = true
            else
                correctData = false
            calledSecond()
        }
    }

编辑:由于您似乎对异步事件的工作方式感到困惑,因此我将简要介绍一下。异步事件与常规事件的不同之处在于它们不受程序流程的影响。这意味着它们的执行完全独立于其他事件。这可以由于各种原因而完成,但是使用AJAX,一个原因是因为它可能需要很长时间才能等待正确的HTTP响应,并且在等待响应的同时运行其他不依赖于响应的事情会更加高效。在进行异步编程时,您必须特别小心,因为您永远不能确定在您的程序中发生的下一次事件之前将会处理异步事件。如果您的某些内容依赖于异步事件的结果,则必须将其放在异步事件完成后调用的回调中。希望这能澄清一些事情。