javascript匿名函数不更新变量

时间:2016-07-02 23:58:37

标签: javascript ajax file closures anonymous-function

这是我的问题。我有一个函数应该得到一个文件并返回内容,因为我的主机提供程序不允许我使用PHP。

function getStoryFromFile(file){
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (xhttp.readyState == 4 && xhttp.status == 200) {
            return xhttp.responseText;
        }
    };
    xhttp.open("GET", file, true);
    xhttp.send();
}

然后我发现匿名函数不能那样工作。所以我试着让它成功。

function getStoryFromFile(file){
    var xhttp = new XMLHttpRequest();
    var x = 'false';
    xhttp.onreadystatechange = function() {
        if (xhttp.readyState == 4 && xhttp.status == 200) {
            x = 'true';
        }
    };
    xhttp.open("GET", file, true);
    xhttp.send();
    if (x == 'true'){
        return xhttp.responseText;
    }
}

但这也不起作用。所以我试图将它调整好几个小时,没有任何效果。我得到的只是'未定义'。那么有人可以向我解释为什么Javascript不允许我以第二种方式返回内容以及为什么javascript的开发人员使语言变得难以理解。谢谢。

修改 如何让回调函数写入变量? 我有:

function displayPage(){

file = 'story1.html' //Not actually like this in file, it changes based on database but i simplified it
var toHTML = '';
getStoryFromFile(file,function(text){
toHTML += text + "<br>";
});
document.getElementById('div').innerHTML = toHTML;
}

即使匿名函数是全局函数,它也不会写入。这是现在的主要问题

1 个答案:

答案 0 :(得分:1)

不,这些都不会起作用,因为它是一个异步调用(与匿名函数无关)。正确的做法是提供一个回调函数。

function getStoryFromFile(file, callback){
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (xhttp.readyState == 4 && xhttp.status == 200) {
            callback(xhttp.responseText);
        }
    };
    xhttp.open("GET", file, true);
    xhttp.send();
}

getStoryFromFile('someFile', function(text){
    // do something with the responseText.  let's console.log it:
    console.log(text);
});