使用来自 JSON 请求的方法和类创建 Javascript 对象

Create Javascript Object with methods and class from deffered JSON request

本文关键字:创建 Javascript 对象 方法 JSON 请求      更新时间:2023-09-26

我想创建一个具有全局范围的对象,该对象具有从外部JSON文件加载的数据。我想在加载文档后使用此对象中的数据。即不等待用户输入。我正在尝试使用jquery不同的方法。我假设 Jquery get 方法生成了适当的不同对象供我稍后使用。声明对象的代码如下

var myData = {
init: function () {
    $.getJSON('data/data.json', function (raw) {    
        myData.data = raw; 
        alert(myData.data['UWLO']['name']);
        yes = true;
        $.each(raw, function (code, details) {
            if (yes){
                alert(code);
            }
            yes = false;
            nameList[details.name] = code;
        });
        //alert(nameList);
    });
},
data: {},
nameList: {},
findByCode: function (code) {
    return myData.data[code];
},
getCode: function (name) {
    return nameList[name];
},
getNameStrings: function () {
    return Object.keys(nameList);
}
} 

初始化对象的代码是

$(document).ready(function () {
    $.when(myData.init()).then(function () {
        alert(myData.nameList);
    });
});

alert(myData.data['UWLO']['name']); request 给出正确的值,以便正确加载 json 文件且格式正确警报(代码);行工作,以便脚本正确进入循环我认为问题在于生成名称列表

你很接近。 $.ajax函数返回deferred对象的承诺。因此,您必须从init函数中返回它,以便以后能够使用它。试试这个:

init: function () {
    return $.getJSON('data/data.json', function (raw) {  

您还可以简化其他代码段:

myData.init().done(function() {
    //...
});

编辑 - 实际上,为了明确回调发生的顺序(以防这在您的实际解决方案中更复杂),像这样创建自己的延迟对象可能会更好:

init: function () {
    var def = $.Deferred();
    $.getJSON('data/data.json', function (raw) {    
        myData.data = raw; 
        alert(myData.data['UWLO']['name']);
        yes = true;
        $.each(raw, function (code, details) {
            if (yes){
                alert(code);
            }
            yes = false;
            nameList[details.name] = code;                
        });
        //alert(nameList);
        def.resolve();
    });
    return def.promise();
},