javascript - 在javascript中访问回调函数的变量 "outside"

标签 javascript callback xmlhttprequest

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/

相关文章:

javascript - Sweet Alert函数在js脚本调用时不会触发

javascript - 如何使用来自外部链接 (Amazon S3) 的 SheetJS 解析 Excel 文件

javascript - 如何使用javascript将本地word docx文件上传到服务器上

javascript - 将数据传递给回调函数的最佳方法是什么?

javascript - 如何从导出为模块的请求中获取回调函数的返回值

javascript - 测试失败 - 多次调用 Mocha 的 done()

android - 无法将 pdf.js 查看器用于本地文件 ://on Android, 适用于 iOS

javascript - 如何知道 JavaScript 中哪个元素调用了函数?

javascript - Jasmine 和 Karma with Jasmine 给出了不同的结果

javascript - 无法附加 <script> 元素