loadJSON(path, callback) {
console.log("path: " + path);
var xobj = new XMLHttpRequest();
xobj.overrideMimeType("application/json");
xobj.open('GET', path, true);
xobj.onreadystatechange = function () {
if (xobj.readyState == 4 && xobj.status == "200") {
callback(xobj.responseText);
}
};
xobj.send(null);
}
上面是一个在本地访问json文件的函数。 然后从`foobar()'解析检索到的数据。 但是,从回调函数的“外部”,无法访问变量“json”。 我搜索过类似的SO问题和异步概念,但仍无法找到解决问题的方法。
function foobar() {
var json;
loadJSON("data.json", function(response) {
json = JSON.parse(response);
console.log(json[0].name); // Successfully shows the result
});
console.log(json[0].name); // TypeError: json is undefined
}
有没有办法访问回调“外部”的变量?
答案 0 :(得分:3)
这是因为它设置为异步模式。
console.log(json[0].name); // TypeError: json is undefined
此代码在json填充之前执行。因此,当您尝试访问它时,它可能仍然是空的。此行中的第三个参数将其定义为Async:
xobj.open('GET', path, true);
你可以试着把
xobj.open('GET', path, false);
但它不再异步,用户必须等待请求结束,所以最好确保使用' json'当回调方法已被调用而不是之前时,var。保持异步模式。 为此,您需要重新构建代码。
Gerardo Furtado发布的链接完全准确,您应该查看。
编辑:正如我已经说过的那样,和其他用户一样,async:false也不是很好,所以我编辑了我的答案:
function foobar() {
var json;
loadJSON("data.json", function(response) {
json = JSON.parse(response);
// Call another function with json that is now filled with data
triggered(json);
});
}
function triggered(json) {
console.log(json[0].name);
// Do your work on json
}
答案 1 :(得分:0)
很简单。在函数外声明json变量。这为变量提供了全局范围。调用该函数只是为了覆盖json,json可以在脚本的任何地方使用