Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.03.2010, 23:48
zakatnov вне форума Посмотреть профиль Отправить личное сообщение для zakatnov Найти все сообщения от zakatnov
  № 1  
Ответить с цитированием
zakatnov

Регистрация: Apr 2009
Сообщений: 43
По умолчанию Обработчик события не "успевает"

есть код:
Код AS1/AS2:
public function loadXml(pathToXML:String):void
{
        xmlLoader.load(new URLRequest(pathToXML));
        xmlLoader.addEventListener(Event.COMPLETE, xmlLoadHandler);
}
 
private function xmlLoadHandler(e:Event):void
{
        trace(0);
}
 
public function getMedia():Object
{
        trace(1)
}
это все методы одного класса, при вызове:
Код AS1/AS2:
Class.loadXml("xml.xml");
Class.getMedia();
Вместо ожидаемого вывода
0
1
выводится
1
0

Как решить эту проблему?

Старый 26.03.2010, 23:53
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 2  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Дык никогда не успеет
вызывать getMedia() нужно в обработчике xmlLoadHandler

В данном случае, судя по приведенным строчкам, нужно просто протащить в loadXML еще колбек
Код AS3:
public function loadXml(pathToXML:String, callback:Function):void
и вызвать этот колбек в обработчике xmlLoadHandler

А уж в самом колбеке теребить getMedia(), когда данные готовы


Последний раз редактировалось expl; 26.03.2010 в 23:57.
Старый 27.03.2010, 00:16
AL.exe вне форума Посмотреть профиль Отправить личное сообщение для AL.exe Посетить домашнюю страницу AL.exe Найти все сообщения от AL.exe
  № 3  
Ответить с цитированием
AL.exe
 
Аватар для AL.exe

Регистрация: Jan 2004
Адрес: Net
Сообщений: 1,049
Отправить сообщение для AL.exe с помощью ICQ
Код AS3:
public function loadXml(pathToXML:String):void
{
        xmlLoader.load(new URLRequest(pathToXML));
        xmlLoader.addEventListener(Event.COMPLETE, xmlLoadHandler);
}
 
private function xmlLoadHandler(e:Event):void
{
        trace(0);
        this.getMedia();
}
 
public function getMedia():Object
{
        trace(1)
}
Код AS3:
Class.loadXml("xml.xml");
__________________
Дело не в тебе

Старый 27.03.2010, 01:22
zakatnov вне форума Посмотреть профиль Отправить личное сообщение для zakatnov Найти все сообщения от zakatnov
  № 4  
Ответить с цитированием
zakatnov

Регистрация: Apr 2009
Сообщений: 43
это все костыли. мне нужно гибкое решение, чтобы я мог вызывать не только getMedia(), а любое количество функций, добавлять их в коллбек или обработчик события не решение, так мне придется весь класс засунуть в этот обработчик.

Старый 27.03.2010, 01:45
koIIImarik вне форума Посмотреть профиль Отправить личное сообщение для koIIImarik Посетить домашнюю страницу koIIImarik Найти все сообщения от koIIImarik
  № 5  
Ответить с цитированием
koIIImarik
 
Аватар для koIIImarik

Регистрация: Jul 2007
Адрес: Россия, Москва
Сообщений: 522
Вам привели корректное решение вашей проблемы. Если вам необходимо, то можете подписать на событие окончания загрузки не одну функцию, а сразу несколько (только не уверен, что это будет правильным решением).

Код:
Код AS3:
Class.loadXml("xml.xml");
Class.getMedia();
У вас работает абсолютно корректно и нужно понимать, что на загрузку внешнего файла необходимо какое-то время, поэтому событие окончания загрузки возникает после вызова вами функции getMedia.

Старый 27.03.2010, 12:48
zakatnov вне форума Посмотреть профиль Отправить личное сообщение для zakatnov Найти все сообщения от zakatnov
  № 6  
Ответить с цитированием
zakatnov

Регистрация: Apr 2009
Сообщений: 43
решения корректные, но мне не подходят, а если у меня будет 100 методов по типу getMedia? мне их все засунуть в обработчик xmlLoadHandler? мне просто нужно что метод loadXml ретурнился только после того как файл загружен.

Старый 27.03.2010, 13:43
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 7  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от zakatnov Посмотреть сообщение
мне просто нужно
«Осторожно, двери закрываются! Следующая станция…» © Метро
Да хоть убейтесь, флеш асинхронен при загрузке данных и синхронным не будет.

Старый 27.03.2010, 13:51
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 8  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
а если у меня будет 100 методов по типу getMedia? мне их все засунуть в обработчик xmlLoadHandler?
Если все они должны работать только когда xml загружен и прочитан - то какие, извините, варианты??? Перестаньте уже мыслить кадрами, Вы программируете, и здесь все строится на событиях и объектах. Пока данные не получены, Вы не можете начать их обработку. Все действия с данными могут начаться только после наступления события "загрузка завершена", т.е. в обработчике этого события.
"..не подходит.." - изменяйте свой подход, только и всего. Потому что он неправильный. Для примера почему - если бы
Цитата:
loadXml ретурнился только после того как файл загружен
то в случае элементарной ошибки загрузки Ваша программа зависла бы навсегда. Именно поэтому процесс загрузки отслеживается сообщениями о событиях и ошибках. Это - правильный подход.
__________________
Reality.getBounds(this);

Старый 27.03.2010, 13:59
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 9  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Цитата:
мне просто нужно что метод loadXml ретурнился только после того как файл загружен
Загрузка происходит асинхронно.
Чем принципиально отличаются участки кода:
Код:
Class.loadXml("xml.xml");
Class.getMedia();
Class.getMedia1();
Class.getMedia2();
Class.getMedia3();
...
Class.getMediaN();
и
Код:
private function xmlLoadHandler(e:Event):void
{
        this.getMedia();
        this.getMedia1();
// еще туча getmediaN();
}
Вопрос нужно ставить так: если getMedia() как-то юзает загружаемый xml, то нужно вызов getMedia() ставить в обработчик, ибо пока нету xml getMedia() отдыхает (второй пример). Если не юзает, то можно без обработчика (первый пример).
Вы себе представляете это как-то иначе?
Конечно, порой хочется синхронности, но такова се ля ви. И да, пихнуть класс в обработчик - это какой-то нонсенс? Типа так:
Код:
private function xmlLoadHandler(e:Event):void
{
        var media:Media = new Media(xmlData);
        // ...
}
UPD
Вот, а еще, говорят, модераторы плохо работают!


Последний раз редактировалось alexcon314; 27.03.2010 в 14:02.
Старый 27.03.2010, 15:51
zakatnov вне форума Посмотреть профиль Отправить личное сообщение для zakatnov Найти все сообщения от zakatnov
  № 10  
Ответить с цитированием
zakatnov

Регистрация: Apr 2009
Сообщений: 43
alexcon314

участки кода отличаются негибкостью и "костылизмом", мне нужен класс который получает xml, обрабатывает, и отдает результат, тоесть

Код AS3:
Class.loadXml("xml.xml");
 
...... //другие методы не этого класса, количество от 0 до бесконечности.
 
var a:String = Class.getSomeStringFromXml("blabla");
и да, пихнуть класс в обработчик это нонсенс, то есть:

Код AS3:
public SomeClass
{
    private var xmlLoader:URLLoader = new URLLoader();
    public function SomeClass(xml:string)
    {
        //загружаем xml
        xmlLoader.load(new URLRequest(pathToXML));
        xmlLoader.addEventListener(Event.COMPLETE, xmlLoadHandler);
    }
 
    private function xmlLoadHandler(e:Event):void
    {
        getMedia();
        getMedia1();
        getMedia2();
        getMedia3();
        getMedia4();
        getMedia5();
        ......
        getMediaN();
    }
 
    //тут идет объявление всех getMedia
 
 
}
Если только так, то о какой гибкости мы можем говорить, какой смысл этого класса если я не могу в начале программы создать экземпляр класса, а в конце вызвать метод который возвратит данные которые мне нужны из этого XML, а в другом скрипте я не могу использовать этот же класс, если создание экземпляра и получение данных идут друг за другом? О каком полиморфизме мы можем тогда говорить?

Wolsh
Я никогда не кодил AS3 с помощью кадров.

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

Основной вопрос, как синхронно вызвать обработчик события, если этого не поддерживает язык, то наверняка должен быть какой-нибудь красивый "костыль".

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:28.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 12:28.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.