JS模块模式中的AJAX

时间:2018-09-02 00:41:28

标签: javascript ajax

我正在使用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();

问题是,当我在“ init”中调用preencheFIlmes时,无法从AJAX获得响应。但是我可以在dataController中得到结果。

有人可以帮助我吗?我正在学习如何使用这种模式。

非常感谢您。

1 个答案:

答案 0 :(得分:1)

您的函数git reset --soft是异步的,不返回任何内容。一个简单的解决方案是添加这样的回调参数:

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 {
                ...
            } 
        }
    }
    ...
}

另一种选择是使用异步/等待功能,请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function