在ajax运行后调用闭包函数

时间:2016-07-07 09:34:58

标签: javascript ajax closures

我是javascript中模块模式和闭包的新手。我正在尝试创建一个获取JSON数据的模块,以便我可以在我的网页上显示它。

var EmailLogs = (function(){

    var emailLogs = [];
    var config = {};

    function init(options){
        for(var prop in options) {
            if(options.hasOwnProperty(prop)){
                config[prop] = options[prop];
            }
        }

        setEmailLogs();
    }

    function setEmailLogs(){
        $.ajax({
            type: "POST",
            headers : { "cache-control": "no-cache" },
            url: "../../ajax/adminGetEmailLogs.php",
            data: {options: JSON.stringify(config)},
            dataType: 'json',
            success: function(values){
                if(values.success)
                {
                    emailLogs = values.emailLogs;
                }
            }
        });
    }

    function getEmailLogs(){
        return emailLogs;
    }

    return{
        init: init,
        getEmailLogs: getEmailLogs,
    }

})();

var options = {
        sData : [
            'email_id'
        ],
        filters : {
            user_id : 44860,
        }
    }

EmailLogs.init(options);
console.log(EmailLogs.getEmailLogs());

我试图在运行init时运行ajax调用。然后我想要显示emailLogs变量。我推测是因为我的ajax正在运行异步,这就是为什么我之后无法获取变量的原因。在运行getEmailLogs()之前,如何确保setEmailLogs()已运行。

1 个答案:

答案 0 :(得分:1)

$.ajax()实现Promise接口并返回Deferred对象see the jQuery docs

  

jQuery 1.5中$ .ajax()返回的jqXHR对象实现了Promise接口,为它们提供了Promise的所有属性,方法和行为(有关详细信息,请参阅Deferred对象)。

这意味着您可以使用promise接口确保在$.ajax()完成后运行所需的方法。

将代码修改为使用promise接口的东西。基本上$.ajax()会向您返回它将被执行的承诺。然后,一旦满足承诺,您就可以将下一个方法链接起来执行。你经常会看到这样的模式链接多个promises(在伪代码中):

doAjaxRequest()
  .then(doSomethingElse)
  .then(doAnotherSomethingElse)

通过这种方式,您可以编写相当干净的异步代码,以避免相互调用大量回调。

The documentation for Q promises有一些很好的例子可以解释承诺的工作方式。

我修改了您的代码段以使用promises:

var EmailLogs = (function(){

    var emailLogs = [];
    var config = {};

    function init(options){
        for(var prop in options) {
            if(options.hasOwnProperty(prop)){
                config[prop] = options[prop];
            }
        }

        setEmailLogs().done(function(values) {
                if(values.success)
                {
                    console.log(values.emailLogs)
                }
            });
    }

    function setEmailLogs(){
        return $.ajax({
            type: "POST",
            headers : { "cache-control": "no-cache" },
            url: "../../ajax/adminGetEmailLogs.php",
            data: {options: JSON.stringify(config)},
            dataType: 'json'
        });
    }

    return{
        init: init,
        getEmailLogs: getEmailLogs,
    }

})();

var options = {
        sData : [
            'email_id'
        ],
        filters : {
            user_id : 44860,
        }
    }

EmailLogs.init(options);