Javascript 函数在ajax请求改变它之前提供了价值

Javascript 函数在ajax请求改变它之前提供了价值,javascript,oop,global-variables,Javascript,Oop,Global Variables,我正在运行一个ajax请求,根据“check\u answer\u status.php”文件中的一些mysql代码检索0、1或2的值。出于测试目的,我加入了警报以检查常规ajax和mysql请求是否正常工作,因此在发出警报时“questions.answerStatus”中包含的值是正确的。但是,我的问题是,“checkAnswerStatus”函数已经执行,并且没有更改“answerStatus”的初始值(出于测试目的,我将其设置为50) 上下文:稍后在代码中,我希望根据变量“answerS

我正在运行一个ajax请求,根据“check\u answer\u status.php”文件中的一些mysql代码检索0、1或2的值。出于测试目的,我加入了警报以检查常规ajax和mysql请求是否正常工作,因此在发出警报时“questions.answerStatus”中包含的值是正确的。但是,我的问题是,“checkAnswerStatus”函数已经执行,并且没有更改“answerStatus”的初始值(出于测试目的,我将其设置为50)

上下文:稍后在代码中,我希望根据变量“answerStatus”的值执行代码

我相信我需要以某种方式包括一些类似“未完成”或类似的内容,但我不知道如何做到这一点。有人能帮我吗?非常感谢

var = Questions = {

answerStatus:50,

checkAnswerStatus : function(question){
    var xmlhttp;
    if (window.XMLHttpRequest){
         xmlhttp=new XMLHttpRequest();
    }
    xmlhttp.onreadystatechange=function(){
        if (xmlhttp.readyState==4 && xmlhttp.status==200){
            test = xmlhttp.responseText;
            Questions.answerStatus = test;
            alert(Questions.answerStatus);
        }
    }
    xmlhttp.open("POST","../../include/check_answer_status.php",true);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.send("q="+question);
},

您发出的请求是异步的(xmlhttp.open函数的第三个参数)。如果您将其更改为:

xmlhttp.open("POST","../../include/check_answer_status.php",false);
它应该会起作用

另一个选项是将回调传递给checkAnswerStatus函数,并在请求完成时调用回调。例如:

checkAnswerStatus : function(question, callback){
    var xmlhttp;
    if (window.XMLHttpRequest){
         xmlhttp=new XMLHttpRequest();
    }
    xmlhttp.onreadystatechange=function(){
        if (xmlhttp.readyState==4 && xmlhttp.status==200){
            test = xmlhttp.responseText;
            Questions.answerStatus = test;
            callback(Questions.answerStatus); //call the function
        }
    }
    xmlhttp.open("POST","../../include/check_answer_status.php",true);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.send("q="+question);
}
然后您将像这样调用函数:

Questions.checkAnswerStatus("bla bla", function(answerStatus) {
   alert(answerStatus);
});

除了Nemos的答案之外,我建议您阅读MDN的以下参考资料:

更多API技术文档,简要概述所有可能性:

更多真实的用例:

希望这有帮助(没问题:)我相信第二种解决方案更好,因为当您向服务器发出请求时,整个应用程序不会冻结。