我正在尝试实现一种模块化视图方法来在我的JavaScript代码中调用json文件,但无法解决该问题。我调用json文件的代码是一个单独的js文件,如下所示:
var fileConfigModule = (function () {
var arData = {};
function init() {
loadJSON(function (json) {
arData = json
});
return arData
}
// Let's hide this function
function loadJSON(callback) {
var xobj = new XMLHttpRequest();
xobj.overrideMimeType("application/json");
xobj.open('GET', './data.json', true);
xobj.onreadystatechange = function () {
if (xobj.readyState == 4 && xobj.status == "200") {
arVals= callback(JSON.parse(xobj.responseText));
}
};
xobj.send(null);
}
return {
loadJSON: loadJSON,
init: init
}
})();
我想在我的主文件中使用此模块,以从类似aysnc的文件中加载json。这使用了回叫功能。
var arData = fileConfigModule.init();
如果有人可以提供帮助,请问我在这里做错了什么。非常感谢
答案 0 :(得分:0)
您正在调用异步函数,但希望返回值作为同步函数。
如下更新代码,
var fileConfigModule = (function () {
function init(callback) {
loadJSON(function (json) {
callback(json);
});
}
// Let's hide this function
function loadJSON(callback) {
var xobj = new XMLHttpRequest();
xobj.overrideMimeType("application/json");
xobj.open('GET', './data.json', true);
xobj.onreadystatechange = function () {
if (xobj.readyState == 4 && xobj.status == "200") {
callback(JSON.parse(xobj.responseText));
}
};
xobj.send();
}
return {
loadJSON: loadJSON,
init: init
}
})();
然后按如下所示致电
var arData = null;
fileConfigModule.init(function(data){
arData = data;
});
我不知道您为什么要隐藏loadJSON
函数。但是我认为您应该直接使用loadJSON
函数,而不是调用init
函数。
呼叫loadJSON
,
var arData = null;
fileConfigModule.loadJSON(function(data){
arData = data;
});