基本上我有
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响应,而calledSecond使用它。我该如何对此进行fxi?
UPDATE:每个人都是对的,如果我把函数调用放在回调部分,它会起作用,但为什么会起作用?你只是让我相信它不起作用,因为Ajax是异步的,所以其余的代码不会等待Ajax完成,那么为什么要把它移到回调部分来解决这个问题呢?
这就是AJAX
异步的原因。编译器不等待AJAX调用完成,然后再编译页面的其余部分。
如果您希望第二次调用calledSecond(),则必须将其放入回调函数中。
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响应可能需要很长时间,并且在等待响应的同时运行不依赖于该响应的其他事情会更高效。执行异步编程时必须特别小心,因为您永远无法保证在程序中的下一个事件发生之前会处理异步事件。如果您有依赖于异步事件结果的内容,则必须将其放置在异步事件完成后调用的回调中。希望这能澄清一些事情。