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
}
有没有办法访问回调“外部”的变量?
最佳答案
是因为设置了Asynchronous模式。
console.log(json[0].name); // TypeError: json is undefined
这段代码是在json填充之前执行的。因此,当您尝试访问它时,它可能仍然是空的。此行中的第三个参数将其定义为异步:
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
}
关于javascript - 在javascript中访问回调函数的变量 "outside",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42666843/