Показать сообщение отдельно
  #1 (permalink)  
Старый 31.05.2013, 23:41
Аспирант
Отправить личное сообщение для xintrea Посмотреть профиль Найти все сообщения от xintrea
 
Регистрация: 02.01.2011
Сообщений: 56

Не понимаю JavaScript. Как сделать ожидание события загрузки данных?
Есть у меня "класс", у которого сделан метод init(). В нем происходит вызов метода load() для загрузки данных с сервера (реализация jQuery xmlrpc).

Задача: вызвать загрузку данных и дождаться результата. Если загрузка удачна - продолжить инит, если была ошибка - завершить инит.

Код:
// Глобальные переменные - статусы загрузки данных с сервера
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);
 };

}
Проблема в строке с циклом while(). На нем скрипт затыкается как на бесконечном цикле.

Если его убрать, то через некоторое время появится сообщение "Success load data from server". Это свидетельствует о том, что данные в подгружаются нормально.

Но я не могу понять, как в "линейном" коде метода init() дождаться появления этих данных. Флаги не помогают. Встраивать обработчики прямо в "линейный" код как лямбды - это издевательство, код получает рваный и плохо сопровождаемый.

Вопрос. Почему не работает этот кусок кода? Почему в цикле while() не отслеживаетс изменение свойства loadStatus? Как сделать чтоб отслеживалось?
Ответить с цитированием