在闭包中调用ajax后公开方法

时间:2016-09-01 00:25:30

标签: javascript jquery ajax methods

所以我终于不知所措,并在这里寻求一点指导。

总结一下这个想法,我在一个闭包中编写了一小段代码,该闭包使用ajax调用来获取反馈。代码将像这样使用......

var myFeedback = feedback();

然后我需要一些暴露的方法,这样就会被调用......

myFeedback.successMessages();

将返回仅包含成功消息的数组。将有一种错误消息,信息消息和所有消息的方法。

如果整个反馈对象都是硬编码的话,我可以轻松编写它,我的问题是反馈对象是从ajax调用中提取的。在过去的6个小时内搜索和尝试不同的解决方案,我终于能够安排一个函数,其中ajax调用的所有值都设置正确,其余的函数按正确的顺序运行。

关于我无法解决的问题......在世界上我如何返回方法对象来暴露它们?在ajax调用之前它很容易,但是对于异步性质,我必须将返回放在另一个函数中,但我似乎无法将它一直返回到基本feedback()函数。我尝试了很多方法,但仍然没有成功。

目前,我得到的错误是Type error feedback(...) is undefined

我在feedback()正确的某个时刻得到了它,但是我尝试访问的方法会出错...... successMessages is not a function

嗯,足够的谈话......这里是代码。正如你所看到的,我最后的微弱尝试就是这样回归......

methods => getFeedback => feedback

除了基础知识之外,我在理解链接和暴露的回报方面远非如此,所以我希望你们能够解释我的问题。

var feedback = function() { 

    var methods = null;

    var getFeedback = function (callback) {

         $.ajax({
            type: "GET",
            url: '<?= Config::get('URL') ?>ajax/feedback',
            dataType:"json",
        }).done(function(response) {

            console.log("Step 1: Retrieve Messages");
            callback(response); 

        }).always(function(){

            console.log("Step 3: Return Methods");
            console.log(methods);
            return methods;

        });

    }

    return getFeedback(function(response) {

        console.log("Step 2: Log Response");
        console.log(response);      

        methods = {
            "successMessages" : function() {
                console.log(response.success);
            },
            "errorMessages" : function() {
                console.log(response.error);
            },
            "infoMessages" : function() {
                console.log(response.info);
            },
            "allMessages" : function() {
                console.log(response);
            },
        };  

    });

};

我应该注意,我将添加关于ajax结果的验证,但是现在我只需要克服这个障碍。

提前谢谢大家!!

1 个答案:

答案 0 :(得分:1)

使用jquery.ajax返回一个promise的事实,使得这段代码比你想象的更简单

Shift Cells Down

用法是

var feedback = function() { 
    var feed = $.ajax({
        type: "GET",
        url: '<?= Config::get('URL') ?>ajax/feedback',
        dataType:"json",
    });

    return {
        "successMessages" : function(callback) {
            feed.then(function(response) {
                callback(response.success);
            });
            // note 1
        },
        "errorMessages" : function(callback) {
            feed.then(function(response) {
                callback(response.error);
            });
            // note 1
        },
        "infoMessages" : function(callback) {
            feed.then(function(response) {
                callback(response.info);
            });
            // note 1
        },
        "allMessages" : function(callback) {
            feed.then(function(response) {
                callback(response);
            });
            // note 1
        }
    };  
};

如果你var myFeedback = feedback(); myFeedback().successMessages(function(success) { console.log(success); }); myFeedback().errorMessages(function(error) { console.log(error); }); myFeedback().infoMessages(function(info) { console.log(info); }); myFeedback().allMessages(function(response) { console.log(response); }); 我已经return feed;,你可以让它变得更简单

note 1