0

基本上我有

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

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

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

4

2 回答 2

2

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

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

于 2013-07-11T20:13:48.870 回答
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 响应,并且在等待响应的同时运行不依赖于该响应的其他事情会更有效. 在进行异步编程时必须特别小心,因为您永远不能假设在程序中的下一个事件发生之前会处理异步事件. 如果你有一些依赖于异步事件结果的东西,你必须把它放在异步事件完成后调用的回调中。希望这可以澄清一些事情。

于 2013-07-11T20:14:32.170 回答