【问题标题】:Exposing public methods after an ajax call within a closure在闭包中进行 ajax 调用后公开公共方法
【发布时间】:2017-01-08 17:09:00
【问题描述】:

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

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

var myFeedback = feedback();

然后我需要一些公开的方法,它们会像这样调用......

myFeedback.successMessages();

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

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

关于我无法解决的问题......我到底如何返回方法对象以公开它们?在 ajax 调用之前它很容易,但是为了异步性质,我必须将 return 放在另一个函数中,但我似乎无法将它一直返回到基本 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 结果等的验证,但现在我只需要克服这个障碍。

提前谢谢大家!!

【问题讨论】:

  • 主要问题是您有一个异步函数 ($.ajax),看起来您希望使用您定义的方法而忽略 $.ajax 的异步性质 - 您想要实现的是然而,相对简单,使用的代码需要重写才能可靠地工作
  • @JaromandaX 感谢您的回复。我了解异步问题,这就是我绊倒的原因。从我围绕 SO 收集的内容来看,是在 ajax 调用中执行回调并将其放入一个变量中,这在某种程度上是一种承诺。我已经尝试过了,并成功地让订单正常工作。但方法上没有成功。有什么想法吗?

标签: javascript jquery ajax methods


【解决方案1】:

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

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 你可以让它更简单

var myFeedback = feedback();

myFeedback().successMessages(function(success) {
    console.log(success);
}).errorMessages(function(error) {
    console.log(error);
}).infoMessages(function(info) {
    console.log(info);
}).allMessages(function(response) {
    console.log(response);
});

【讨论】:

  • 这简直太棒了!我不敢相信你看到了如此干净和清晰的方式。我很惊讶也很感激......
猜你喜欢
  • 1970-01-01
  • 2011-08-16
  • 2011-01-30
  • 1970-01-01
  • 2021-01-21
  • 2018-12-08
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
相关资源
最近更新 更多