Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   [Алгоритмы] Тайминг/последовательность выполнения и dispatchEvent (http://www.flasher.ru/forum/showthread.php?t=212294)

Yansan 15.01.2016 15:50

Тайминг/последовательность выполнения и dispatchEvent
 
Здравия!
Проблема вот в чём - конструктор "LableField()" заканчивает своё выполнение быстрее нежели добавляется слушатель "lableField.addEventListener(LableField.graphDataLoaded, lableFieldLoaded)" на окончание конструктора, в связи с чем "dispatchEvent(new Event(LableField.graphDataLoaded))" срабатывает слишком рано и на этом всё заканчивается, то есть функция "lableFieldLoaded(e: Event)" никогда не сработает.
Я что-то упускаю из виду, но что? Прошу подсказать, если не ответ, то хотя бы путь где поискать, а пока штудирую справочники :(

Код AS3:

package {
  import flash.display.Sprite;
  import tp.*;
  import flash.events.Event;
 
  public class TestProj extends Sprite {
      private var graphConteiner: Sprite;
 
      public function TestProj() {
        trace ("TestProj Создание основного контейнера отображения");
        graphConteiner = new Sprite();
 
        trace ("TestProj Запуск конструктора LableField()");
        var lableField = new LableField();
 
        trace ("TestProj Добавление слушателя addEventListener(LableField.graphDataLoaded, lableFieldLoaded)");
        lableField.addEventListener(LableField.graphDataLoaded, lableFieldLoaded);
 
        function lableFieldLoaded(e: Event): void {
 
            trace("TestProj Присвоение переменной данных из LableField");
            var lableContData = lableField.getContainerLableField();
 
            trace("TestProj Добавление в контейнер непосредственного отображения");
            if (graphConteiner.contains(lableContData)==false) graphConteiner.addChild(lableContData);
 
            trace("TestProj Добавление на экран основного контейнера отображения");
            addChild(graphConteiner);
        }
      }
  }
}

Код AS3:

package tp {
  import flash.events.EventDispatcher;
  import flash.events.Event;
  import flash.display.Sprite;
  import flash.text.TextField;
 
  public class LableField extends EventDispatcher {
      public static const graphDataLoaded: String = "graphDataLoaded";
      private var labContainer: Sprite; //контейнер для хранения лэйблов
 
      public function LableField() {
        labContainer = new Sprite();
 
        var Lable001: TextField = new TextField();
        Lable001.x = 10;
        Lable001.y = 10;
        Lable001.text = "Если это видно на экране, значит всё работает как надо.";
 
        trace ("LableField Добавление данных в группу labContainer");
        labContainer.addChild(Lable001);
 
        trace ("LableField Запуск dispatchEvent(new Event(LableField.graphDataLoaded))");
        dispatchEvent(new Event(LableField.graphDataLoaded));
      }
 
      public function getContainerLableField() {
        return (labContainer);
      }
  }
}


Wolsh 15.01.2016 20:09

Ну, Вы подписываетесь на событие после того, как оно отправлено. А вопрос-то в чем?
Нет никакого вообще смысла отправлять какие-то события из конструктора. Потому что пока работает конструктор, нет его результата — объекта, с которым может что-то случиться) Некому посылать событие и нельзя подписаться на событие от объекта, которого еще нет. Это абракадабра.

У меня вот есть вопрос — Вам зачем тут событие вообще, о чем оно? Код итак исполняется синхронно, и само собой, что на строку, следующую после new ..() вы перейдете только после того, как конструктор полностью отработает. То есть можете смело считать, что свое "событие" вы уже получили.

Yansan 15.01.2016 23:12

Да, Вы правы. Странная у меня получилась логика. В данном примере EventDispatcher вообще не нужен. Я как-то совсем упустил что пока new ... () не закончит своё действие, выполнение дальше не пойдёт. Значит проблема у меня в чём-то другом.

Спасибо за ответ.
Тут всё, пошёл искать проблемы в других местах.


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

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