У меня есть следующий код 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 не работает после двух запросов. Как заставить это работать?
Заранее спасибо.
Проблема в том, когда getEventsData
метод вызывается обратным вызовом ajax this
не относится к Test
объект так this.getEventsData
будет неопределенным Решение заключается в использовании Function.bind () или же $ .Proxy () передать пользовательский контекст выполнения в обратный вызов
events_request.always($.proxy(this.getEventsData, this));
Другой вариант — установить контекстную опцию $ .Ajax () так что все обратные вызовы получат пользовательский контекст выполнения.
Этот объект станет контекстом всех обратных вызовов, связанных с Ajax. От
по умолчанию контекст является объектом, который представляет настройки AJAX
используется в вызове ($ .ajaxSettings объединены с параметрами, переданными в
$ .Ajax).
Других решений пока нет …