Я пытаюсь реализовать подход модульного представления для вызова файла json в моем коде javascript, но не могу исправить проблему. Код, в котором я вызываю файл 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
}
})();
Я хочу использовать этот модуль в своем основном файле, чтобы загрузить json из файла, например, aysnc. Это использует функцию обратного вызова.
var arData = fileConfigModule.init();
Пожалуйста, если кто-то может помочь, что я делаю неправильно здесь. Большое спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы вызываете асинхронную функцию, но ожидаете возвращаемого значения в качестве функции синхронизации.
Обновите свой код, как показано ниже,
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;
});
Я обновил свой ответ вызовом функции loadJSON.
Большое спасибо. Я пытаюсь понять функции обратного вызова и то, как они работают.
Это может вам помочь: codeburst.io/….
Это работает для меня отлично. Можете ли вы объяснить мне немного больше, почему это работает, почему у вас есть дополнительный звонок для обратного звонка? И как мне напрямую вызвать функцию loadJSON в подобном примере? или как лучше это написать?