javascript - JS 模块模式中的 AJAX

标签 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 中得到结果。

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

非常感谢。

最佳答案

您的函数 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

关于javascript - JS 模块模式中的 AJAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52133167/

相关文章:

javascript - 我需要 Ajax .on 来触发第二个 .on 而不是第一个

c# - 在 Ajax.BeginForm MVC 4 场景中发送异常消息

javascript - 如何创建一个新的 gsheet 并其中已有脚本?

javascript - 使用 Office JS Word API 从对话框访问 Word 文档上下文

javascript - 在 IE 10 中使用复合键创建索引时出现 DataError

javascript - 彩票游戏,根据数值范围添加css类

javascript - 将变量设置为与 div 相同的内容

javascript - 是否有用于类似 stackoverflow 的投票的 Ajax(原型(prototype)或 JQuery 插件)示例?

javascript - jQuery 无法解析使用 Ruby-JSON 构建的 JSON

php - Codeigniter php - 基于使用 JQuery 的下拉选择返回(ajax?)数据