Загрузка JSON-файла модульного представления JavaScript подход - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь реализовать подход модульного представления для вызова файла 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(); 

Пожалуйста, если кто-то может помочь, что я здесь не так делаю.Большое спасибо

1 Ответ

0 голосов
/ 26 февраля 2019

Вы вызываете асинхронную функцию, но ожидаете возвращаемого значения в качестве функции синхронизации.

Обновите свой код, как показано ниже,

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;
}); 
...