Я создаю приложение, используя шаблон модуля в JS. Я создал два модуля, и у меня есть этот код:
var dataController = (function () {
var request = new XMLHttpRequest();
var getFilmes = function () {
request.onreadystatechange = function() {
if (request.readyState === 4) {
if (request.status === 200) {
var obj = JSON.parse(request.responseText);
return obj;
} else {
console.info('An error occurred during your request: ' + request.status + ' ' + request.statusText);
}
}
}
request.open('Get', 'http://localhost:8080/api/filmes/5b8947446f506266bc522f38');
request.send();
}
return {
filmes: function (){
return getFilmes();
}
};
})();
var controller = (function (dataCtrl) {
var preencheFilmes = function(){
var obj = dataCtrl.filmes();
console.info(obj);
}
return {
init: function(){
console.info("APP START");
preencheFilmes();
}
};
})(dataController, UIController);
controller.init();
Проблема в том, что я не могу получить ответ от AJAX, когда вызываю preencheFIlmes в "init". Но я могу получить результат в dataController.
Кто-нибудь может мне помочь? Я учусь работать с этим шаблоном.
Большое спасибо.



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


Ваша функция getFilmes() асинхронна и ничего не возвращает. Простое решение - добавить такой параметр обратного вызова:
var getFilmes = function(callback) {
request.onreadystatechange = function() {
if (request.readyState === 4) {
if (request.status === 200) {
var obj = JSON.parse(request.responseText);
callback(obj); // <-- calls the callback function
} else {
...
}
}
}
...
}
Затем вы можете передать анонимную функцию обратного вызова, когда хотите получить результаты:
var preencheFilmes = function(){
dataCtrl.filmes(function(obj) {
console.info(obj);
});
}
Другой вариант - использовать функцию async / await, см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function