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

Javascript 代码执行是否等待Ajax响应?,javascript,ajax,global-variables,timing,Javascript,Ajax,Global Variables,Timing,基本上我有 correctData = false//global variable function calledFirst() { xmlhttp.onreadystatechange=function() { if(xmlhttp.readyState == 4 && xmlhttp.status == 200) { proceedDiv.innerHTML =

基本上我有

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响应,calledSecond使用它。我怎样才能找到这个


更新:每个人都是对的。如果我将函数调用放在回调部分,它会工作,但为什么它会工作?您刚刚说服我它不起作用,因为Ajax是异步的,所以代码的其余部分不会等待Ajax完成,所以为什么将其移动到回调部分可以解决这个问题?

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


如果希望第二次调用calledSecond(),则必须将其放入回调函数。

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


如果希望第二次调用calledSecond(),则必须将其放入回调函数中。

这是因为Ajax请求是异步处理的。基本上,在处理请求时,代码的其他部分将运行。如果您有一个依赖于响应的函数,请将其放入回调中。这将确保在请求完成之前不会调用函数,因为只有在满足请求后才会运行回调(
readyState==4
status==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响应可能需要很长时间,而在等待响应的同时运行其他不依赖于该响应的事情会更加高效。在进行异步编程时必须特别小心,因为您永远不能假设异步事件将在程序中的下一个事件发生之前得到处理。如果有依赖于异步事件结果的内容,则必须将其放置在异步事件完成后调用的回调中。希望这能澄清一些问题。

这是因为Ajax请求是异步处理的。基本上,在处理请求时,代码的其他部分将运行。如果您有一个依赖于响应的函数,请将其放入回调中。这将确保在请求完成之前不会调用函数,因为只有在满足请求后才会运行回调(
readyState==4
status==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响应可能需要很长时间,而在等待响应的同时运行其他不依赖于该响应的事情会更加高效。在进行异步编程时必须特别小心,因为您永远不能假设异步事件将在程序中的下一个事件发生之前得到处理。如果有依赖于异步事件结果的内容,则必须将其放置在异步事件完成后调用的回调中。希望这能澄清一些问题。

Put
calledSecond()
在您的
onreadystatechange
回调中。@NoahFreitas您能解释一下为什么这样做吗?Put
calledSecond()
在您的
onreadystatechange
回调中。@NoahFreitas您能解释为什么这样做吗?换句话说,代码会继续运行,但当Ajax响应发生时,回调代码会运行吗?回调完成后,执行行将从它停止的地方重新开始?有点像。当Ajax请求启动时,它将继续尝试调用回调函数,直到收到正确的就绪状态和http状态。然而,程序不会等待这种情况发生,因为有时可能需要一段时间。因此它将在请求之后继续运行任何操作,这就是为什么依赖于请求结果的任何内容都必须放在回调中。@Celeritas更新了我的答案,以便对异步事件提供更深入的解释。换句话说,代码会继续运行,但当Ajax响应发生时,回调代码会运行吗?回调完成后,执行行将从它停止的地方重新开始?有点像。当Ajax请求启动时,它将继续尝试调用回调函数,直到收到正确的就绪状态和http状态。然而,程序不会等待这种情况发生,因为有时可能需要一段时间。因此,它将在请求之后继续运行任何内容,这就是为什么您拥有的任何依赖于请求结果的内容都必须放在回调中。@Celeritas更新了我的答案,以便对异步事件提供更深入的解释