javascript:范围外的json的XMLHttpRequest

时间:2017-02-08 04:23:53

标签: javascript json scope xmlhttprequest

所以我试图获取json数据并将其存储在变量中。问题是.onReadyStateChange块内的所有内容都像黑洞,没有任何东西离开那里,所以我无法检索信息。我可以从该块中调用函数并且它可以工作,但是我尝试保存到外部实体的任何内容都将导致null,即使该变量属于窗口范围。

var globalVar;

xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        var foodsArray = JSON.parse(this.responseText);
        globalVar = JSON.stringify(foodsArray);
    }
}

console.log(globalVar);
//result will be null, so will foodsArray had I made it global

所以我的问题是,有没有办法将该信息保存在该块之外?感谢。

2 个答案:

答案 0 :(得分:1)

console.log调用是同步的,而globalVar的分配是异步完成的,因此即使在分配解决之前,null也会先打印。

==编辑==

您可以选择将XMLHttpRequest对象包装在Promise中:

var prom = new Promise(function(resolve,reject) {
    xmlhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            resolve(this.responseText);
        }
    }
});

prom.then(function(foodsArray) {
    console.log(foodsArray);
});

答案 1 :(得分:1)

首先,您需要了解ajax的原理。你知道,ajax是一个异步函数,所以当你没有得到返回值时,' console.log(globalVar)'已被执行。所以你应该写道:

var globalVar;

xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        var foodsArray = JSON.parse(this.responseText);
        globalVar = JSON.stringify(foodsArray);
        console.log(globalVar); // you can get the result
    }
}