xintrea
Новичок
Есть у меня "класс", у которого сделан метод init(). В нем происходит вызов метода load() для загрузки данных с сервера (по xmlrpc).
Задача: вызвать загрузку данных и дождаться результата. Если загрузка удачна - продолжить инит, если была ошибка - завершить инит.
Проблема в строке с циклом while(). На нем скрипт затыкается как на бесконечном цикле.
Если его убрать, то через некоторое время появится сообщение "Success load data from server". Это свидетельствует о том, что данные в подгружаются нормально.
Но я не могу понять, как в "линейном" коде метода init() дождаться появления этих данных. Флаги не помогают. Встраивать обработчики прямо в "линейный" код как лямбды - это издевательство, код получает рваный и плохо сопровождаемый.
Вопрос. Почему не работает этот кусок кода? Почему в цикле while() не отслеживаетс изменение свойства loadStatus? Как сделать чтоб отслеживалось?
Задача: вызвать загрузку данных и дождаться результата. Если загрузка удачна - продолжить инит, если была ошибка - завершить инит.
Код:
// Глобальные переменные - статусы загрузки данных с сервера
var lb_load_status_ok=0;
var lb_load_status_in_process=1;
var lb_load_status_error=2;
...
function LBTeamData()
{
var loadStatus;
this.init = function(id)
{
// Загрузка с сервера информации
this.load(id);
// Ожидание завершения загрузки
while( loadStatus==lb_load_status_in_process ){};
// Если была ошибка
if(loadStatus==lb_load_status_error)
return;
// ... здесь продолжается инициализация ...
};
this.load=function(teamId)
{
loadStatus=lb_load_status_in_process;
var that = this;
// Получение данных о команде
$.xmlrpc({
url: 'http://'+window.location.host+'/XmlRpcServer',
methodName: 'getTeam',
params: [teamId],
success: function(response, status, jqXHR){ that.successLoad(response, status, jqXHR); },
error: function(jqXHR, status, error) { that.errorLoad(jqXHR, status, error); }
});
};
// Обработчик получения данных
this.successLoad=function(response, status, jqXHR)
{
loadStatus=lb_load_status_ok;
name=response[0]['name']; // Название команды
unitsNames=response[0]['unitsNames']; // Имена игроков
alert("Success load data from server");
};
// Обработчик ошибки при получения данных
this.errorLoad=function(jqXHR, status, error)
{
loadStatus=lb_load_status_error;
alert("Error at getting team data from server: "+error);
};
}
Если его убрать, то через некоторое время появится сообщение "Success load data from server". Это свидетельствует о том, что данные в подгружаются нормально.
Но я не могу понять, как в "линейном" коде метода init() дождаться появления этих данных. Флаги не помогают. Встраивать обработчики прямо в "линейный" код как лямбды - это издевательство, код получает рваный и плохо сопровождаемый.
Вопрос. Почему не работает этот кусок кода? Почему в цикле while() не отслеживаетс изменение свойства loadStatus? Как сделать чтоб отслеживалось?