为什么jQuery的ajax".always"功能无法正常工作

pmv*_*rma 0 javascript php ajax jquery long-polling

我有以下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();
Run Code Online (Sandbox Code Playgroud)

服务器端php如下

<?php
sleep(5); 
echo "This is response";
?>
Run Code Online (Sandbox Code Playgroud)

我想要做的是从服务器获取数据,以防".done或.fail"完成,所以我使用".always"功能.但是只有两个请求发送到服务器,之后没有请求.我使用Firebug进行调试.但遗憾的是没有任何错误.我怎么知道为什么ajax在两个请求之后不工作.如何让它工作?

提前致谢.

Aru*_*hny 6

问题是当getEventsDataajax调用该方法时,回调this没有引用该Test对象,因此this.getEventsData将是未定义的.解决方案是使用Function.bind()$ .proxy()将自定义执行上下文传递给回调

events_request.always($.proxy(this.getEventsData, this));
Run Code Online (Sandbox Code Playgroud)

另一种选择是设置$ .ajax()的上下文选项,以便所有回调都将获得自定义执行上下文.

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