Разбираюсь значит с загрузкой данных с сервера и событийной моделью в 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: Да, я не хочу использовать лямбды, я хочу чтобы мой код был как минимум читабельный.