AJAX в шаблоне модуля JS - PullRequest
       2

AJAX в шаблоне модуля JS

0 голосов
/ 02 сентября 2018

Я создаю приложение, используя Module Pattern в 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.log('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.log(obj);

    }

    return {
        init: function(){
            console.log("APP START");
            preencheFilmes();
        }
    };

})(dataController, UIController);


controller.init();

Проблема в том, что я не могу получить ответ от AJAX, когда я вызываю preencheFIlmes в "init". Но я могу получить результат в dataController.

Кто-то может мне помочь? Я учусь работать с этим шаблоном.

Большое спасибо.

1 Ответ

0 голосов
/ 02 сентября 2018

Ваша функция 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.log(obj);
    });
}

Другой вариант - использовать функцию асинхронного ожидания / ожидания, см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...