Модераторы: SoWa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение данных и проблема ассинхронности 
V
    Опции темы
THandle
Дата 18.9.2011, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: нет
Всего: 372



Всем привет. Извиняюсь за не очень внятное название темы. В AS я совсем новичок, так что не пинаем smile

Имеется следующая проблема.

Имеется флешка и имеется сервер.
Во флешке есть некий класс отвечающий за удаленную работу с устройством , у него есть следующий метод геттер для свойства:

Код

        public function get State()
        {   
            GetState();
            return FState;
        }


FState - некое свойство, отвечающее за состояние устройства.
Все вроде бы хорошо, но! В GetState() я через Socket посылаю запрос о состоянии на сервак, так как сокет асинхронный, то ответ ко мне придет не очень даже понятно когда. Ответ приходит по событию сокета SOCKET_DATA.
А свойство FState вернется из функции State сразу после того как функция GetState() закончит свое выполнение.
Вешать флешку(графику) нельзя.
А значение FState устанавливается только в самом обработчике события SOCKET_DATA, когда приходит ответ от сервера.

Вот и вопрос: как сделать такое ожидание, чтобы return FState происходило только тогда когда придет ответ от сервера?

Спасибо.

ЗЫ: гуглить пытался, но не получается нормально подобрать запрос.

PM   Вверх
bars80080
Дата 18.9.2011, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: нет
Всего: 315



Цитата(THandle @  18.9.2011,  19:44 Найти цитируемый пост)
А значение FState устанавливается только в самом обработчике события SOCKET_DATA, когда приходит ответ от сервера.

вот там и сделать вызов метода, который поменяет значение FState, а также запустит прерванный процесс дальше. а графика между 

        public function get State()
        {   
            GetState();

        }

и 

обработчиком события SOCKET_DATA

пускай выполняет какие-то промежуточные действия


        public function get State()
        {   
            GetState();
            метод_показать_песочные_часы();
        }


PM MAIL WWW   Вверх
THandle
Дата 21.9.2011, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: нет
Всего: 372



Проблема решилась следующим образом:

Создается свой тип события.
Код


package mypack {

    import flash.events.Event;
    public class StateEvent extends Event
    {
               public static const CHANGE: String = "stateChange";
 
               public function StateEvent(type: String, data: Object = null)
           {
                   super(type, data);
                   // ...
               }
    }
    
}


После чего из основного класса вызываем метод:

Код

        public function SetLogSend(Send: int)
        {
            FCasher.GetState();
    }


в Методе GetState() отсылаем запрос и устанавливаем листенер нашего события:

Код

        public function GetState()
        {
                        // посылка запроса
            this.addEventListener(StateEvent.CHANGE, onCasherStateReceived);
        }


В обработке сокета onSocketData, обрабатываем ответ на наш запрос, меняем State и диспетчеризируем наше событие:
Код


                            if (eX.casher[0].hasOwnProperty('@state'))
                            {
                                  FState = eX.casher[0].@state;
                                      dispatchEvent(new Event(StateEvent.CHANGE));
                            }


В обработчике события вызываем какую-то функцию в основном классе:

Код

        private function onCasherStateReceived(event: Event): void
        {
            FMain.CasherStateChanged();
            this.removeEventListener(StateEvent.CHANGE, onCasherStateReceived);
        }


А там уже выполняем какие то действия, касающиеся этого FState:

Код

        public function CasherStateChanged()
            {
            FUpdate();
        }

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | ActionScript 3 | Следующая тема »


 




[ Время генерации скрипта: 0.0463 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.