返回未定义的JavaScript JSON解析

返回未定义的JavaScript JSON解析,javascript,json,undefined,Javascript,Json,Undefined,我有以下功能 function getSetting(item) { var rawFile = new XMLHttpRequest(); rawFile.overrideMimeType("application/json"); rawFile.open("GET", "settings.json", true); rawFile.onreadystatechange = function() { if (rawFile.readyState

我有以下功能

function getSetting(item) {
    var rawFile = new XMLHttpRequest();
    rawFile.overrideMimeType("application/json");
    rawFile.open("GET", "settings.json", true);
    rawFile.onreadystatechange = function() {
        if (rawFile.readyState === 4 && rawFile.status == "200") {
            var data = JSON.parse(rawFile.responseText);
            return data.item;
        }
    }
    rawFile.send(null);
}
我是这样测试的

console.log(getSetting('restaurant_name'));
它正在返回未定义的

数据的console.log会按预期返回我的JSON文件的JSON对象

项的console.log会按预期返回餐厅名称

我肯定遗漏了一些明显的东西,但在查看了与此相关的Stackoverflow的其他主题之后,我还没有发现任何东西

我曾尝试使用数据[0]。item来获得结果,但也没有什么不同

settings.json文件的内容:

{
  "restaurant_name": "Example_Restaurant_Name",
  "restaurant_address": "Example Restaurant, England"
}
非常感谢您的帮助,谢谢

  • 您使用的对象查找形式不正确,因为您的代码正在JSON上查找
    名称
  • 函数无法直接从异步请求返回
  • 请尝试以下方法:

    function getSetting(item, callback) {
        var rawFile = new XMLHttpRequest();
        rawFile.overrideMimeType("application/json");
        rawFile.open("GET", "settings.json", true);
        rawFile.onreadystatechange = function() {
            if (rawFile.readyState === 4 && rawFile.status == "200") {
                var data = JSON.parse(rawFile.responseText);
                callback(data[item]);  // <----- THIS LINE CHANGES
            }
        }
        rawFile.send(null);
    }
    
    getSetting('restaurant_name', function (value) { console.log(value); });
    
    函数getSetting(项,回调){
    var rawFile=new XMLHttpRequest();
    overrideMimeType(“application/json”);
    打开(“GET”,“settings.json”,true);
    rawFile.onreadystatechange=函数(){
    if(rawFile.readyState==4&&rawFile.status==200){
    var data=JSON.parse(rawFile.responseText);
    
    回调(data[item]);//我认为问题出在return语句中

    return data.item
    
    这将尝试在数据对象中为键“item”返回一个值,而您需要返回数据对象中的值,其中键存储在item变量中

    我认为正确的语法是:

    return data[item]
    
    我也不认为您可以在这里从函数返回值,因此您需要在异步请求返回值后定义回调函数,或者设置一个作用域在函数外部的变量


    其他人刚刚发布了一个使用回调函数的答案,因此我建议使用这种方法。

    是的,我将提供第二个参数,如
    getSetting(item,callback)
    并解释如何使用它..Doh,完全跳过了这一点,我将进行编辑以包括在内。谢谢,这很有效。你只是不明白,异步函数不必返回任何东西,相反,你必须学会如何处理承诺和callbacks@webdeb-谢谢。根据wmorrell之前的示例,我确实收到了一个回调-这是数据[项目]vs data.item,我看到的每一个获取JSON值的例子都因为某种原因引用了data.item。谢谢Stephen,这很有意义。