Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > ActionScript 3 > Возврат значения функции класса


Автор: Error202 6.4.2012, 10:53
У меня с 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 в классе... Почему и как сделать, чтобы функция класса возвращала результат уже после полной обработки?

Автор: Simplifier 6.4.2012, 13:24
Цитата

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

Никак. События в 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;
}

Автор: Error202 6.4.2012, 13:28
Супер, спасибо!

Автор: Simplifier 6.4.2012, 13:29
=)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)