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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возврат значения функции класса 
:(
    Опции темы
Error202
  Дата 6.4.2012, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 5.11.2004
Где: Moscow

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



У меня с AS3 туго... немного не пойму...

Есть класс в отдельном as файле...
В основной программе он импортируется...
Код

import p001;
...
var p = new p001();


Затем вызывается функция, которая должна возвращать данные, полученные с удаленного сервера
Код

var s:String = p.getUserName();


Процедура getUserName класса скачивает с сайта текстовый файлик с помощью URLloader и отдает его содержимое в onComplete процедуре переменной класcа UserName 
Код

var UserName:String='';

public function getUserName():string {
   loader.addEventListener(Event.COMPLETE, onComplete);   
   ...
   return UserName
}

private function onComplete(e:Event) {
   ...
   UserName='Тут имя пользователя';
}


Так в переменной S основной программы ничего нет... 
По trace видно, что код главной программы отрабатывает раньше, чем onComplete в классе... Почему и как сделать, чтобы функция класса возвращала результат уже после полной обработки?
PM MAIL WWW   Вверх
Simplifier
Дата 6.4.2012, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 18.7.2011

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



Цитата

как сделать, чтобы функция класса возвращала результат уже после полной обработки?

Никак. События в as3 происходят асинхронно и функция не может блокировать выполнение программы, ожидая наступления события.
Но, если требуется получать загружаемые данные из внешнего класса, то можно реализовать это например так:
Код

package {
    import flash.events.EventDispatcher;
    import flash.events.Event;
    public class p001 extends EventDispatcher{
        //...
        public function requestUserName():String {
           //...
           loader.addEventListener(Event.COMPLETE, onComplete);   
           //...
        }
        
        private function onComplete(e:Event):void {
           //...
           //диспетчеризуем пользовательское событие. передаем ему имя пользователя, которое содержится в loader.data, когда загрузка завершена
          dispatchEvent(new CustomEvent(Event.COMPLETE, loader.data));
        }
    }
}

//вспомогательный класс. располагается в том же файле
import flash.events.Event;
class CustomEvent extends Event {
    public var userName:String;
    public function CustomEvent(type:String, userName:String, bubbles:Boolean = false, cancelable:Boolean = false):void {
        super(type, bubbles, cancelable);
        this.userName = userName;
    }
}

Использование класса:
Код

private var s:String;
private var p:p001 = new p001;
p.requestUserName();
p.addEventListener(Event.COMPLETE, onUserNameGot);
private function onUserNameGot(e:CustomEvent):void {
    s = e.userName;
}

PM MAIL   Вверх
Error202
Дата 6.4.2012, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 5.11.2004
Где: Moscow

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



Супер, спасибо!
PM MAIL WWW   Вверх
Simplifier
Дата 6.4.2012, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 18.7.2011

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



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


 




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


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

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