JavaScript: в callback функции теряется контекст. Как это обойти?

xintrea

Новичок
Разбираюсь значит с загрузкой данных с сервера и событийной моделью в JavaScript.

У меня есть "класс", в нем нужно сделать инит, который включет загрузку данных с сервера и их небольшую обработку. Для инита и загрузки данных используется цепочка функций. Вторая в цепочке инита функция вызывается как callback после получения данных с сервера. В общем, всё как учили.

Код примерно такой:

Код:
function LBTablesWorker() 
{

 // Начало инициализации
 this.init = function(iTeamId) 
 {
  // Загрузка с сервера
  this.load(iTeamId, this.initNext); 
 }; 
 

 // Продолжение инициализации
 this.initNext = function() 
 {
  alert('In LBTablesWorker::initNext()'); // Это сообщение видно
  
  this.calculate(); // Здесь ошибка
 }

 
 // Вот эта функция не вызывается
 this.calculate=function() 
 {
  alert('2*2=4');
 };

 
 // Загрузка данных с сервера
 this.load=function(teamId, callback) 
 {
  var that = this;

  // Получение XML-кода  
  $.xmlrpc({
        url: 'http://'+window.location.host+'/XmlRpcServer',
        methodName: 'getTables',
        params: [teamId],
        success: function(response, status, jqXHR){ that.successLoad(response, status, jqXHR); callback(); },
        error: function(jqXHR, status, error) { that.errorLoad(jqXHR, status, error); }
  });

 };
}
Проблема в том, что по всей видимости, при вызове callback-функции теряется контекст. И в такой функции невозможно вызвать функции собственного же класса.

Ошибка в Opera:
Uncaught exception: TypeError: 'this.calculate' is not a function
Ошибка в FireFox:
TypeError: this.calculate is not a function
initNext
Вопрос. Как это можно обойти? Как правильно вызывать callback-функции, чтобы они выполнялись в контексте того места, которому изначально принадлежат?

Note: Да, я не хочу использовать лямбды, я хочу чтобы мой код был как минимум читабельный.
 

MiksIr

miksir@home:~$
Код:
-        success: function(response, status, jqXHR){ that.successLoad(response, status, jqXHR); callback(); },
+        success: function(response, status, jqXHR){ that.successLoad(response, status, jqXHR); callback.call(that); },
 
Сверху