【问题标题】:Why the jQuery's ajax ".always" functions is not working properly为什么 jQuery 的 ajax ".always" 函数不能正常工作
【发布时间】:2014-09-16 08:44:18
【问题描述】:

我有以下 Javascript 代码,它总是向服务器询问一些数据。

;var EVENTS = {};
;(function($) {

    EVENTS.Test = {
      getEventsData: function() {

        var events_request = $.ajax({
            url: "test1.php",
            contentType: 'application/json-rpc',
            type: "GET",
            timeout: 30000
        });

        events_request.done(function(results) {alert(results);});

        events_request.fail(function(results) {alert(results);});

        events_request.always(this.getEventsData);
    }   
    };

})(jQuery);

EVENTS.Test.getEventsData();

服务器端php如下

<?php
sleep(5); 
echo "This is response";
?>

我想做的是从服务器获取数据以防“.done”或“.fail”完成,所以我使用“.always”功能。但是只向服务器发出了两个请求,之后就没有请求了。 我使用Firebug进行调试。但不幸的是没有任何错误。我怎么知道为什么在两次请求后 ajax 不起作用。如何让它发挥作用?

提前致谢。

【问题讨论】:

    标签: javascript php jquery ajax long-polling


    【解决方案1】:

    问题是当 getEventsData 方法被 ajax 回调调用时,this 不引用 Test 对象,所以 this.getEventsData 将是未定义的。解决方案是使用Function.bind()$.proxy() 将自定义执行上下文传递给回调

    events_request.always($.proxy(this.getEventsData, this));
    

    另一个选项是设置$.ajax()的上下文选项,这样所有的回调都会得到一个自定义的执行上下文。

    这个对象将成为所有 Ajax 相关回调的上下文。经过 默认情况下,上下文是表示 ajax 设置的对象 在调用中使用($.ajaxSettings 与传递给的设置合并 $.ajax)。

    【讨论】:

    • 或者只是$.proxy(this.getEventsData, this),假设第一次使用正确的上下文调用函数。
    • @MattiasBuelens 是的...否则即使this.getEventsData 引用也不起作用...
    • 这就是我们所需要的。顺便说一句,我更喜欢 $.proxy()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多